之前看《计算机网络总结》一书时总结了一遍博客,里面大概的写了TCP/IP的网络数据发送流程:http://www.yangxg.com/blog/4239664756.html,从中就 简单介绍了网络层IP数据报 和 传输层TCP数据报 的 组装形式。这里会详细说明IP数据报格式 和 TCP数据报格式内容。
IP数据报格式
版本
:占4位,指IP协议的版本。通信双方使用的IP协议必须一致。目前广泛使用的IP协议版本号为4(即IPV4)。
首部长度
:占4位,可表示最大十进制数值是15(二进制 1111)。特别注意,这个字段所表示的单位是32位字长(即4个字节),因此,当IP的首部长度为15时(二进制 1111),首部长度
就达到60个字节。最常见的首部长度就是20个字节(即值为 0101)。
服务类型
:也叫 区分服务
,占8位,用于区分服务,当前没有实际使用过。
总长度
:占16位,是指首部和数据之和的长度,单位为字节,因此数据报的最大长度为 2^16 = 65535字节。
标识(identification)
:占16位,IP层维护着一个计数器,每产生一个数据报时,计数器就加1,并将此值赋给标识字段。当数据报由于长度超过网络的MTU而必须分片时,这个
标识字段的值就被复制到所有的数据报的标识字段中。相同的标识字段的值使分片后各数据报片最后能正确重装成原来的数据报。
标识(identification)
:占3位,(111),但目前只有2位有意义。
最低位为 MF (More Fragment)。MF=1即表示后面还有切片
的数据报。MF=0表示这已是若干数据报片中的最后一个。
中间为为 DF (Don't Fragment)。意思是 不能切片
。只有当DF=0是才允许分片。
片偏移
:占13位。片偏移以8个字节为偏移单位
,即值为1代表偏移了8个字节。一个数据报放不下这么大的数据,就需要使用几个数据报,然后在接收端重组,如何重组?这就需要在切割
的时候记录下各个数据在原来数据报中的偏移,比如说按1000字节切割,开头的数据偏移为0,第二段数据偏移为125。
例如:有一数据报的数据部分为3800字节(使用固定首部),需要分片的长度不超过1420字节。固定首部为20字节。需要计算分片后的片偏移值?
IP包最大总长度为 1420字节,IP包头部固定为 20字节,因此每个数据报的数据部分长度最大为:
1420-20=1400字节
那么我们可以算的切片次数为:
ceil(3800/1400) = 3次
即 1400+1400+1000 = 3800字节
又因为片偏移的单位为:8个字节
所以:
第一个切片,片偏移为 0
第二个切片,片偏移为 1400/8=175
第三次切片,片偏移为 (1400+1400)/8=350
生存时间
:占8位,生存时间字段常用的的英文缩写是 TTL(Time To Live)
,表明是数据报在网络中的寿命。由发出数据报的源点设置这个字段。其目的是防止无法交付的数据报无限制
地在因特网中兜圈子,因而白白消耗网络资源。最初的设计是以秒作为 TTL 的单位。每经过一个路由器时,就把 TTL 减去数据报在路由器消耗掉的一段时间。若数据报在路由器消耗的时间小于1秒,
就把TTL值减1。当TTL值为0时,就丢弃这个数据报。
协议
:占8位,协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分上交给哪个处理过程。
常见协议的对应字段值:
ICMP 1
IGMP 2
TCP 6
UDP 17
OSPF 89
首部检验和
:占16位。这个字段只检验数据报的首部,但不包括数据部分。这是因为数据报每经过一个路由器,路由器都要重新计算一下首部检验和(一些字段,如生存时间、标志、片偏
移等都可能发生变化)。不检验数据部分可减少计算的工作量。
源地址
:占32位。
目的地址
:占32位。