IP
前四个bit代表版本信息 后四个bit代表IP头长度
(Type of Service):服务类型 8 bit 8 位定义如下ppp DTRCD :
000普通级
001优先级
010立即发送
011闪电式的
100 比闪电还闪电
101 CRL/TLC/ECP
110 网间控制
111 网络控制
D延迟:0 普通,1延迟尽量小
T吞吐量:0普通,1流量尽量大
R可靠性:0普通,1可靠性尽量大
M传输成本:0普通,1成本尽量小
IP包长度:长度17bit IP包最大的长度为 65535
标识符(Identifer):长度为16bit,该字段和flags和fragment offset 联合使用,对较大的上层数据包分段操作
标记:第一位不可用,第二位是DF,DF位设置1时,表明路由器不能对上层数据包分段
片偏移:长度为8bit,表示该IP包在改组分片包中的位置,接受段以此来组装还原IP包
TTL:长度8bit 当IP包进行传送的时候,先在该字段赋予一个特定的值;
{
当IP包经过每一个沿途的路由器的时候,每个路由器会将IP包TTL的值减1
当TTL的值为0时,该IP包被丢弃,这个字段可以防止由于路由器环路而导致IP包不停被转发
TTL的作用是限制IP数据包在计算机网络存在的时间,TTL的最大值:255,推荐的值为64,TTL是IP数据包在计算机网络中可以转发的最大跳数
}
protocol:表示上层协议
头部校验和:16bit 用来检测IP头部的正确性,不包含数据部分,由于每个路由器要改变TTL,所以路由器每个数据重新计算这个值
TCP
源端口和目的端口不用说了….
序列号: 由于TCP封包必须带入IP封包中,所以TCP数据太大时,就要进行分段,seq就是每个封包的序号,可以让收端重新将TCP数据组合一起,序号段的值指本报文所发送的数据第一个字节的序号
数据偏移:占4位,表示TCP报文段的首部长度。注意,“数据偏移”的单位是32位字(即以4字节长的字为计算单位)。故TCP首部的最大长度为60字节。
保留:占6位,保留为今后使用,目前置为0;
Flags:
Reserved,Nonce,CWR,ECH-Echo,保留功能,
Urgent:1bit 紧急指针位,取值1时代表数据加快传输,取值0时是普通数据传输,
Ack:1bit 确认位,取值1时代表这是一个确认的tcp包,取值0则不是确认包
Push:1bit紧急位,取值1时代表要求发送方发送该分段接收方尽快的交给应用层,不做队列处理,取值0时是普通包
Rst:1bit重置位,当tcp收到一个不属于该主机的任何一个连接数据时,则向对方发送一个复位包,此时取值是1,取值0时代表这个包是给自己的
Syn:1bit请求位,取值1时代表这是一个tcp三次握手包,取0代表其他包,
Fin:1bit完成位 取值1时代表这是一个tcp挥手连接宝,取值0是其他包
windows size:16bit 滑动窗口 表示准备收到的每个tcp数据的大小
checksum:头部校验,计算tcp的头
Urgent pointer:16bit 紧急指针,URG取值为1时有效
选项部分的应用:
MSS最大报文段长度(Maxium Segment Size):指明数据字段的最大长度,数据字段的长度加上TCP首部的长度才等于整个TCP报文段的长度。MSS值指示自己期望对方发送TCP报文段时那个数据字段的长度。通信双方可以有不同的MSS值。如果未填写,默认采用536字节。MSS只出现在SYN报文中。即:MSS出现在SYN=1的报文段中。
窗口扩大选项(Windows Scaling):由于TCP首部的窗口大小字段长度是16位,所以其表示的最大数是65535。但是随着时延和带宽比较大的通信产生(如卫星通信),需要更大的窗口来满足性能和吞吐率,所以产生了这个窗口扩大选项。
SACK选择确认项(Selective Acknowledgements):用来确保只重传缺少的报文段,而不是重传所有报文段。比如主机A发送报文段1、2、3,而主机B仅收到报文段1、3。那么此时就需要使用SACK选项来告诉发送方只发送丢失的数据。那么又如何指明丢失了哪些报文段呢?使用SACK需要两个功能字节。一个表示要使用SACK选项,另一个指明这个选项占用多少字节。描述丢失的报文段2,是通过描述它的左右边界报文段1、3来完成的。而这个1、3实际上是表示序列号,所以描述一个丢失的报文段需要64位即8个字节的空间。那么可以推算整个选项字段最多描述(40-2)/8=4个丢失的报文段。
时间戳选项(Timestamps):可以用来计算RTT(往返时间),发送方发送TCP报文时,把当前的时间值放入时间戳字段,接收方收到后发送确认报文时,把这个时间戳字段的值复制到确认报文中,当发送方收到确认报文后即可计算出RTT。也可以用来防止回绕序号PAWS,也可以说可以用来区分相同序列号的不同报文。因为序列号用32为表示,每2^32个序列号就会产生回绕,那么使用时间戳字段就很容易区分相同序列号的不同报文。
MTU最大传输单元