一、TCP报文段的首部格式
-
TCP是面向字节流的
-
TCP在发送数据时,从发送缓存中取出一部分或全部字节并给其加上一个TCP首部,使其成为TCP报文段然后交给网络层(TCP是运输层,其下层是网络层)
- 一个
TCP报文段
由TCP首部
和数据载荷
部分组成 - TCP的全部功能都体现在其首部中各个字段的作用
- 一个
-
TCP的首部格式如下所示:
- 数据偏移(4bit):该字段表示
数据载荷
的首字节在整个TCP报文段中的位置,同时也代表了TCP首部的长度,因为TCP首部由固定首部20字节
和最大扩展首部40字节
组成,所以数据偏移字段最小是为20字节,最大是60字节;又因为该字段的单位是4字节,故最小值用二进制表示是0101
,最大值是1111
,在《计算机网络—自顶向下方法》中该字段也叫首部长度 - 源端口和目的端口(各占2个字节16bit):源端口用来表示发送方的应用进程,目的端口用来标识接收方的应用进程
- 序号seq、确认号ack、ACK标志位:
序号字段
:占4字节32bit,取值范围 [ 0 , 2 32 − 1 ] [0,2^{32}-1] [0,232−1],序号增大到最后一个后,下一个序号从0开始;用于指出TCP报文段中数据载荷的第一个字节的序号确认号字段
:占4字节32bit,取值范围 [ 0 , 2 32 − 1 ] [0,2^{32}-1] [0,232−1],序号增大到最后一个后,下一个序号从0开始;用于指出期望收到对方下一个TCP报文段的数据载荷的第一个字节的序号,同时也是对该序号之前的所有数据的确认- 如确认号为n,表示到序号n-1的所有数据都已经正确接收,期望下次接收到序号为n的数据
ACK标识位
:占1个bit;ACK=1
确认号字段有效,ACK=0
确认号字段无效;TCP建立连接后,所有传送的TCP报文都必须把ACK置1
- 保留字段(6bit):未使用,目前置0
- 窗口字段(2字节16bit):以字节为单位,表示发送该报文的那一方的
接收窗口大小
,用于配合拥塞窗口调整对方的发送窗户大小 - 校验和字段(2字节16bit):使用校验算法检查整个TCP报文段(首部和数据载荷)在传输过程中是否产生差错,注意和
IP
协议首部中的首部校验和字段
区分,首部校验和字段仅仅校验IP首部,且在传输过程中动态变化 - 同步标志位SYN:在TCP建立时用于同步序号,
SYN=1
表示这是一个TCP请求连接报文段 - 终止标志位FIN:用来释放TCP连接,
FIN=1
表明这是一个TCP释放连接请求报文段 - 复位标志位RST:用来复位TCP连接,
RST=1
表明TCP连接出现异常,需要释放连接,然后再重新建立连接;也可以用于拒绝一个非法报文段或拒绝打开TCP连接 - 推送标志位PSH:接收方的TCP收到
PSH=1
的报文段后会尽快向上交应用进程,而不是等到接收缓存填满后再一并上交 - 紧急标志位URG、紧急指针:
URG
占1bit;URG=1
时紧急指针有效,URG=0
时紧急指针无效紧急指针
:占2字节16bit,以字节为单位,用来指明紧急数据的长度- 当发送方有紧急数据时,URG和紧急指针配合使用,发送方会将紧急数据插队到发送缓存最前面,并立刻包装一个TCP报文段(其中
URG=1
,紧急指针生效),TCP报文段数据载荷的最前面是紧急数据,紧急指针说明了紧急数据的长度,紧急数据之后是普通数据
二、UDP的数据报首部格式
- UDP数据报同样也由首部和数据部分组成
- 首部仅仅有4个字段8个字节:
源端口
、目的端口
、长度
、检验和
- 源端口:源端口用来表示发送方的应用进程
- 目的端口:目的端口用来标识接收方的应用进程
- 长度:以字节为单位,指明该UDP数据报的长度(首部+数据部分)
- 检验和:接收方使用校验和来检查整个UDP数据报是否出错(其实计算该校验和时还涉及到IP首部的一些字段,不过这里忽略不表)
如果本文对您有用,可以点赞、收藏本文哦,下次用到时就好找多了
如果能关注作者就太好了,作者将持续学习,持续输出,持续分享!谢谢鼓励!