关于TCP传输协议(协议头详解篇)
在进行网络通信时,如果传输层选择的是TCP协议,那么你接下来每次进行网络通信时,都会在你的数据上包装一个TCP协议头,来控制你数据的可靠性以及网络传输性能问题,所以要想深入的理解TCP协议中的那些特性,熟悉TCP头部是非常重要的,弄清楚TCP头部每个字段的作用,那么你在了解TCP特性就会容易许多。
先来粘一张TCP头的图片
是的,就这小小的60个字节,就能干很多事情
TCP头部各字段介绍
- 16位源端口号
“四元组”之一,其他主机要想访问此机的指定程序,则需要通过此端口号来唯一标识。需要注意的是,在主动建立连接的一方的端口号是系统分配的,所以不需要手动设置,而被动连接的一方一般是服务器,服务器在被连接的时候是需要预先设置自己的端口并处于监听状态才可以被连接。 - 16位目的端口号
“四元组”之一,主动建立连接的一方需要设置目标端口 - 32位序号
在建立连接时,第一次发送的数据报会随机生成一个32位无符号的序列号(与时间有关),在之后发送数据报中的序列号,都是加上发送数据报(除头部)的字节数,序号的设计是“保证”数据的能被对方接收到。 - 32位确认号
确认号是根据收到的数据报的序号+数据报长度(除包头)+1来确定的,确认号的目的是通知发送发自己已经收到了(确认号-1)这么多的字节,下一次希望收到确认号字节开始的数据,这里的字节是相对的,不是真实的。 - 4位头部长度
表示该数据报头部的大小,一个单位表示4个字节,4*(2^4)=60,60恰好是数据报头最大长度 - 6位保留
保留位,目前没有实际意义,留着以后做扩充,实际上目前只有四位保留位了,只是一些老的实现不能理解新增的两位,所以这里也不深入讨论 - 16位窗口大小
此窗口大小指的是自己滑动窗口最大能接受的字节数,16位则是65535字节,通过滑动窗口来提高数据的传输效率,所以窗口最大大小是直接影响网络吞吐量的,只有16位肯定是不行的,所以当然不止有16位,在TCP头部选项中是可以增加窗口位数的,后边聊 - 16位校验和
用于校验数据的正确定的,16位校验和包括校验数据报的头部和数据报的数据。 - 16位紧急指针
可以理解为紧急处理的数据,接收方收到紧急处理后会优先处理,前提是URG位要置1,否则无效,实际很少用。 - 6位报文标识位
UGR:紧急指针是否有效
ACK:确认号是否有效,只有在第一次建立连接的时候没有置位
PSH:接收端立刻读取缓冲区,为下边传输做准备
RST:重新建立连接,复位报文段
>触发条件:1.访问端口不存在
2.异常终止连接诶
3.处于半打开连接
SYN:建立连接标志,同步报文段
FIN:结束连接标志结束报文段
11.选项,最多40字节
Kind=0:选项表结束选项
Kind=1:空选项,将选项表补齐4字节整数倍
Kind=2:最大报文段长度选项,建立连接时,双方使用该选项来确定最大报文段长度(MSS),通常为(MTU-20-20)字节,避免本机发生IP分片,MTU为IP报的最大长度。
Kind=3:窗口扩大因子选项,建立连接时,接收窗口大小为16位(65535字节),为了提高网络吞吐量,可通过该字段增加窗口位数(0<length<14)
Kind=4:选择性确认选项,当有数据传输丢失是,TCP会重传之后的所有数据,降低性能。在建立连接阶段,询问双方是否都支持SACK技术,如果都支持,则开启,以后只会重传丢失的数据。
Kind=5:SACK实际工作选项,左边沿,右边沿中间数据是没收到的数据,最多4个块。
Kind=8:时间戳选项,较为精确的计算通信双方之间的回路信息,服务于流量控制。