出一个专栏把通信协议搞一下吧,万物互联的根本呀。
IP
版本4位:4(二进制0100)表示IPv4,6(二进制0110)表示IPv6
报头长度(单位4byte):因为选项长度不确定,取值范围是5-15(20-60byte)
服务类型:优先级(前3位)+ToS(后5位),首先按数据紧急情况划分出优先级,然后是ToS允许按照什么方式选择传输服务,ToS第1位表示最小时延即响应时间,第2位是吞吐量,第3位是最高可靠性,第4位是最低费用,第5位保留,不需要这些服务就填0
总长度(单位1byte):IP报头+数据长度(除本层协议外的都视为数据),所以载荷是总长度-报头长度
分段标识类型:表示同一时刻最多65536个包被分段(分片)来表示包编号,这个标识用于组装时确定某个分片是属于哪个包的
标志:分片标志是确定该包是否被分片,如果分片了是不是最后一片,第1位保留,第2位DF=0表示分片,DF=1表示未分片,第3位MF=0表示是最后一片,MF=1表示还有分片,MF结合组装buf中的偏移量是否完整来判断该包是否接收组装完成
分段偏移量(单位byte):分片相对报头偏移量,用于确定组装顺序,如果分片超时丢失将回复异常并重新分片收发
TTL:包生存时间,防止数据包在网络中传输不休,以前是时间值,后来常用的是跳数递减,每经过一个路由值-1,减到0会返回相应错误,所以发起包的主机可以通过从1开始递增直到不返回错误时来测试要到达的目主机需要经过多少个路由器
报头16位校验和:计算报头长度指定数据,不包括载荷但要包含选项,无选项时为20个字节,发送计算时校验和本身要清0,然后算出校验和填充校验结果,接收方会将这20个字节用同样的方法计算出结果为0表示正确否则出错,而由于每个路由器都会对TTL-1,所以每经过一个路由都会对这个校验和重新计算填充,到达下一个路由又会再次校验,计算方法参考: https://blog.csdn.net/wswit/article/details/46822189
选项:是可选项,一般情况没有,如果有一般是时间戳、源点或路由加入的信息,用于选择松散路由(可选多条路)或严格路由(规定了路由路径)或记录路由,如果不够32位的整数倍就填0补齐
TCP
源端口目的端口:是0-65535任何数字,在收到请求时系统会为客户端动态分配,0-1023为知名端口号
报文序号:用来标识从TCP源端向TCP目标端发送的数据字节流,它表示在这个报文段中的数据编号,用sequence表示
确认序号:只有ACK标志为1时,确认号字段才有效,它包含目标端所期望收到源端的下一个数据编号,用acknowledge表示
报头长度(单位4byte):因为选项长度不确定,取值范围是5-15(20-60byte)
URG:紧急标志位,紧急指针有效,1表示有效
ACK:确认序号有效,1表示有效
PSH:推送标志位,1表示接收方应该尽快将这个报文段交给应用层,但只是整个数据的一部分并不是所有,类似收到短信提醒一样
RST:1表示重新连接
SYN:1表示发起一个新的连接
FIN:1表示释放一个连接,finish
窗口尺寸(单位byte):此字段用来进行流量控制,这个值是本机期望下一次接收的最大长度
带伪头部的TCP报头校验和:这个是伪头部(12+20+选项长度+数据长度)16位校验值
紧急指针:它是一个偏移量(也就是先发的包长度),和报文序号字段中的值相加表示紧急数据最后一个字节的序号
选项:可能包括"窗口扩大因子"、"时间戳"等选项
CRC: 从MAC到数据所有内容进行的CRC32校验结果,不论是传输层、网络层计算包长度时都不包含crc32这4个字节的长度,这是物理链路封包校验用的
大小端转换与协议字段:大小端的转换其实就是针对字段内的存储顺序转换,不能改变协议字段的先后顺序,这个先后就是从MAC层开始,MAC要放在协议开头前面,随着地址逐渐增大直到数据段以及CRC放在后面,将来收发双方才能按照这个顺序解析正确,所以针对不到一个字节的协议字段和大于1个字节的协议字段在结构体赋值和数组赋值时都不尽相同。