今日推荐文章:https://cloud.tencent.com/developer/article/2458050 这篇文章详细讲解了TCP全面的三次握手、四次挥手、超时重传、流量控制以及拥塞控制等各个方面,本文相当于该篇文章的详细版本,看完有助于更加透彻地了解本文
TCP协议是网络传输中十分重要的组件,如果用一句话来描述TCP协议:TCP是一个可靠的(reliable)、面向连接的(connection-oriented)、基于字节流的(byte-stream)、全双工的(full-duplex)协议,而本篇文章将会带大家全面了解TCP协议中的基石——TCP首部信息
通过使用wireShark工具对访问网络的连接进行抓包我们可以得到如下信息:
一般来说,IP层协议会存储源IP与目标IP,而TCP协议层做的事情则是存储源端口与目标端口,源IP、源端口、目标IP、目标端口唯一确定了TCP的一个四元组,一个四元组可以唯一确定一个标识,一台主机上的端口号最多有65536个,而端口号也分为好几种,有熟知端口号,端口范围为(0~1023),例如SSH连接的22端口号、HTTP连接的80端口号,已登记的端口号,端口范围为(1024~49151),例如MySQL数据库默认连接的端口号是3306,Redis连接的端口号为6379,还有临时端口号,端口范围为(49151~65535),这类端口号一般是由机器临时分配的,在没有使用时会进行回收再次利用
序列号的作用是确定发送数据包的先后顺序,同时在建立连接、防止发送失败等场景也有重要作用,当客户端向服务端发送一个数据包时,通过数据包对应的序列号与报文长度,服务端可以唯一确定发送的是哪一段数据
同时由于网络层(IP层)并不保证发送包的顺序,通过序列号TCP协议可以解决网络包乱序、重复的问题,以保证能够按照顺序接收网络包,例如如果发送方发送包的顺序是1,2,3,4,但是到达接收方的顺序为3,2,1,4,2,那么接收方就可以通过序列号剔除多余包并按照顺序进行接收组装
TCP使用确认号来告知对方下一个期望接收的序列号,小于此确认号的所有字节都已经收到,确认号在数据包重传过程中有重要应用,例如在快速重传中,当发送方收到连续三个一样的ACK时,就会知道对应ACK之后的数据包丢失,会进行重传:
在客户端与服务端建立连接时,会通过发送初始序列号(SYN)来建立连接,如果对应的期望序列号与ACK都满足预期,那么说明连接建立成功,而这也就是所谓的三次握手:
而关于确认号有几个值得注意的地方:
1)不是所有的包都需要确认,TCP协议中有Nagle算法,其主要作用就是当双方都会互相发送数据时,会将几个包合并起来进行一次发送,这时只需要对最后发送的包进行确认即可,而无需对所有发送的包进行确认
2)不是收到了数据包就会立刻进行确认,可以延迟一会儿进行确认,例如在Linux网络通信中有延迟确认机制,当接收方收到数据包时,不会进行延迟确认,它可能会等待处于重传过程中的数据包,或者等到接收到多个数据包时,回复最后一个接收到的数据包对应的下一个ACK,以减少网络之间的通信量
3)确认号表示小于这个数字的所有序列号都已经收到了,这也是通信双方进行网络传输的核心要点
在往下就是TCP的标记了,在标记之前有头部长度,主要用于确定读取多少长度的头部字段,保留位可以由用户自定义字段实现特定功能,接下来我们详细介绍一下TCP的这些标记位:
SYN(Synchronize):用于发起连接数据包同步双方的初始序列号
ACK(Acknowledge):确认数据包
RST(Reset):用于强制断开连接,无论是否还有数据包都会直接断开连接,一般只有在连接不合法或者出现异常情况时才会使用
FIN(Finish):同时对方已经发送完了所有数据,准备断开连接
PSH(Push):告知对方这些数据包发送完后应该马上交给上层应用,不能缓存起来
用于表示窗口大小的位数只有16位,换算一下也就是65536字节(64KB),这个大小对于当下计算机系统来说肯定是远远不够用的,因此TCP协议又引入了TCP窗口缩放这个选项作为窗口缩放的比例因子,比例因子的范围为0~14,即最小0为原来大小64KB,最大14为原来大小64KB*(1<<14),窗口缩放值会在三次握手时指定,例如在用wireShark抓包后,展示的窗口大小为65536:
可选项的格式如下:
例如以最大报文数据段(MSS)为例,下面对应例子中的kind=2,length=4,value=1460:
TCP常用来定义的选项有以下几个:
MSS:最大段大小选项,是TCP允许从对方接收的最大报文段
SACK:不同于ACK确认号,ACK确认号只会发送一个数字表示下一个期望接收的序列号,SACK发送的是一个已经确认的序列号区间,例如{1~1000,2001~5000}则表示中间1001~2000的序列号没有收到,在数据包丢失要进行重传的场景下作用显著
Window Scale:窗口缩放选项,范围为0~14
好了以上就是关于TCP首部字段的全部拆解与分析了,希望对你有所帮助!!!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。