竭诚为您提供优质文档/双击可除tcp,ip封装过程协议
篇一:tcpip详解-卷一-协议-第一章-概述-1.6封装
1.6封装
当应用程序用tcp传送数据时,数据被送入协议栈中,然后逐个通过每一层直到被当作一串比特流送入网络。其中每一层对收到的数据都要增加一些首部信息(有时还要增加尾部信息),该过程如图1-7所示。tcp传给ip的数据单元称作tcp报文段或简称为tcp段(tcpsegment)。ip传给网络接口层的数据单元称作ip数据报(ipdatagram)。通过以太网传输的比特流称作帧(Frame)。
图1-7中帧头和帧尾下面所标注的数字是典型以太网帧首部的字节长度。在后面的章节中我们将详细讨论这些帧头的具体含义。
以太网数据帧的物理特性是其长度必须在46~1500字节之间。我们将在4.5节遇到最小长度的数据帧,在2.8节中遇到最大长度的数据帧。
所有的internet标准和大多数有关tcp/ip的书都使用octet这个术语来表示字节。使用这个过分雕琢的术语是有历史原因的,因为tcp/ip的很多工作都是在dec-10系统上进行的,但是它并不使用8bit的字节。由于现在几乎所有的计算机系统都采用8bit的字节,因此我们在本书中使用字节(byte)这个术语。
更准确地说,图1-7中ip和网络接口层之间传送的数据单元应该是分组(packet)。
分组既可以是一个ip数据报,也可以是ip数据报的一个片(fragment)。我们将在11.5节讨论ip数据报分片的详细情况。
图1-7数据进入协议栈时的封装过程
udp数据与tcp数据基本一致。唯一的不同是udp传给ip的信息单元称作udp数据报(udpdatagram),而且udp的首部长为8字节。
回想1.3节中的图1-4,由于tcp、udp、icmp和igmp 都要向ip传送数据,因此ip必须在生成的ip首部中加入某种标识,以表明数据属于哪一层。为此,ip在首部中存入一个长度为8bit的数值,称作协议域。1表示为icmp协议,2表示为igmp协议,6表示为tcp协议,17表示为udp协议。
类似地,许多应用程序都可以使用tcp或udp来传送数据。运输层协议在生成报文首部时要存入一个应用程序的标
识符。tcp和udp都用一个16bit的端口号来表示不同的应用程序。
tcp和udp把源端口号和目的端口号分别存入报文首部中。
网络接口分别要发送和接收ip、aRp和RaRp数据,因此也必须在以太网的帧首部中加入某种形式的标识,以指明生成数据的网络层协议。为此,以太网的帧首部也有一个16bit的帧类型域。
篇二:tcp数据包的封装与发送
tcp数据包的封装与发送
一、实验目的
1.掌握tcp的工作特点;
2.熟悉tcp数据包的结构;
3.深刻理解网络体系结构中传输层与上下层之间的关系;
二、实验环境
1.pc机一台
2.windows操作系统
三、实验准备
1.复习tcp协议的相关内容;
2.熟练掌握tcp数据包中各自段的作用;
四、实验内容(二选一)
1.编写程序构造tcp包结构,并填写各字段,将封装后的tcp包的内容在屏幕上输出并写入指定的文件中;
2.tcp包的数据字段内容额长度自定;
五、实验报告要求
1.报告内容要有主程序的流程图和程序代码;
2.报告内容要有运行结果的截图;
3.对实验过程进行分析,对存在的问题分析。
实验相关代码
#include
#include
#include
#include
#include
#pragmacomment(lib,"ws2_32.lib")
//数据结构及宏定义:
#defineipVeR4//ip协议预定
#definemax_buFF_len65500//发送缓冲区最大值
#definedest_poRt5050//目的端口号
#definesouR_poRt8080//源端口号
typedefstructip_hdr//定义ip首部
{
uchaRh_verlen;//4位首部长度,4位ip版本号
uchaRtos;//8位服务类型tos ushoRttotal_len;//16位总长度(字节)ushoRtident;//16位标识
ushoRtfrag_and_flags;//3位标志位uchaRttl;//8位生存时间ttl uchaRproto;//8位协议(tcp,udp或其他) ushoRtchecksum;//16位ip首部校验和ulongsourceip;//32位源ip地址ulongdestip;//32位目的ip地址
}ip_headeR;
typedefstructtsd_hdr//定义tcp伪首部{
ulongsaddr;//源地址
ulongdaddr;//目的地址
uchaRmbz;//没用
uchaRptcl;//协议类型
ushoRttcpl;//tcp长度
}psd_headeR;
typedefstructtcp_hdr//定义tcp首部{
ushoRtth_sport;//16位源端口
ushoRtth_dport;//16位目的端口
ulongth_seq;//32位序列号
ulongth_ack;//32位确认号
uchaRth_lees;//4位首部长度/6位保留字uchaRth_flag;//6位标志位
ushoRtth_win;//16位窗口大小
ushoRtth_sum;//16位校验和
ushoRtth_urp;//16位紧急数据偏移量
}tcp_headeR;
usingnamespacestd;
//主要函数:
//checksum:计算校验和的子函数ushoRtchecksum(ushoRt*buffer,intsize) {
unsignedlongcksum=0;
while(size>1)
{
cksum+=*buffer++;
size-=sizeof(ushoRt);
}
if(size)
{
cksum+=*(uchaR*)buffer;