UDP
协议
UDP
协议用于网络协议传输层交互,不同于TCP
,UDP
没有重传、重复包的处理,不保证传输可靠性,其下层为IP
协议。
消息结构
Source Port
占用16
比特,为可选择域,如果不使用可以全写为0
,指示是发送的端口,但缺乏其它有效信息时,也作为回应的目的端口;Destination Port
占用16
比特,指示目标端口号;length
为UDP
包的字节长度,包含header
部分,最小值为header
长度8
个字节。
Checksum
为校验位,计算时需要加上UDP
虚拟头部、真实头部、数据部分及末尾补0
部分一起计算。需要补齐整个数据长度为两个字节的倍数,计算时以16-bit
数据为最小单位进行求和,如果存在进位,则将进位1
加到低16
位数字上去,计算完成后取反的结果即为Checksum
。如果没有Checksum
时,此域需要全部填值为0
。
TCP
协议
TCP
提供可靠的传输模式,TCP
和UDP
同样是传输层协议,其主要差别在于TCP
保证可靠性,因而不同于UDP
,TCP
工作是面向连接的。
消息结构
Source port/Destination Port
为源和目的端口号,各占有16
比特;Sequence number
占用32
比特,指示数据包中第一个字节的SN
,如果存在携带初始SN
为ISN
的SYN
时,第一个数据字节的SN
为ISN+1
;Acknowledgement Number
指示期望收到的下一个连续的SN
号;Data offset
占用4
比特,指示TCP
头部总的32
比特word
长度,可计算开始数据开始位置;Reserved
占用6
比特,留后续使用;URG
占用1
比特,用来指示Urgent Pointer
是否存在;ACK
占用1
比特,用来指示Acknowledgment
域是否存在意义;PSH
占用1
比特,用于指示Push
功能;RST
占用1
比特,用于重置连接;SYN
占用1
比特位,同步SN
号;FIN
占用1
比特,指示发送端是否还存在更多需要发送的数据,用于结束链接;window
占用16
比特,指示从Acknowledgment
域开始数据窗口长度;Checksum
计算校验和,包括头和内容,不足16
比特部分补零对齐,计算时需要增加IP
的虚拟头部;Urgent Pointer
占用16
比特,和URG
标志配合使用,指示正常数据起始位置,在此位置之前为带外数据(
紧急数据);Options
为字节的倍数,存在两类option
,一种是只带类型option-kind
,另一种带有option-kind + option length + option data
,option length
包括kind
和length
本身的共两个字节的长度; Padding
用于补齐TCP
头部长度,满足32
比特word
对齐。
Options
在TCP
模式下,携带的Option
都需要被执行。
传输可靠性
TCP
不同于UDP
,提供了数据的可靠传输,这种可靠性依赖于停止-
等待协议机制,主要体现在SN
的ACK
机制上。首先需要将TCP
连接的两端SN
进行同步,也就是SYN
标志位带有的功能,当SYN
为1
是带有的SN
号即为ISN(
初始SN
号)
,常常听到的三/
四次握手就是实现此功能,相当于初始建立链路过程,发起端需要首先发送SYN
给对端,对端需要对SYN
包返回ACK
,同样需要对端发送相应SYN
来确认接收的起始SN
号,并对相应TCP
包返回对应ACK
,因此此流程有四个过程交互;而对端返回ACK
时可以同时携带SYN
标志,可以简化为三条消息。相对于建立流程,链路同样可以使用类似方式释放,通过标志FIN
来控制。在传输过程中需要维护数据的SN
及其ACK
状态,加以不同的Timer
进行丢包重传控制;Window
域用来表示接收到ACK
的数据到最多允许发送的数据包的窗口大小,也就是说超出窗口的数据不能,窗口的大小影响实际情况下的速率。TCP
基于SN
次序进行有次序的传输,紧急(
带外)
数据可以采用Urgent
模式传输。Push
标志影响发送、接收的处理时间,在接收端收到标志位将不等待缓存状态,直接将数据递交上层梳理。TCP
采用的是面向连接的分组交换机制,当状态出错时,可以用Rest
机制来重新恢复链路链路,同时存在平静时间的定时器来确保分组机制网络中的残留的数据包能够处理完成,减少状态和数据类型冲突的概率。
参考文档
RFC768 User Datagram Protocol
RFC793 TRANSMISSION CONTROL PROTOCOL