💻文章目录
📄前言
TCP三次握手、四次挥手,相信许多计算机网络初学者们都对这些问题感到困扰,TCP协议作为考试、面试的大常客,如果不真正了解它们的原理,那么等待你的很可能是挂科、回去等通知吧(大悲)。为了避免悲剧的再度发生,学习TCP协议不容刻缓,从现在开始!!!
Tcp基础
概念
TCP(Transfer Control Protocol) ,是一种可靠的、面向连接的网络通信协议,常用与那些对数据完整性有严格要求的场景,如聊天、文件传输、Web浏览等场景。
Tcp能够实现对数据的流量控制、重发控制、拥塞控制等功能,如果只是在应用层中使用TCP协议,那么肯定是无法体会得到其内部机制的精细,让我们从理论开始入手Tcp协议吧。
Tcp的优缺点:
-
优点:
- 保障数据传输的可靠性
- 拥有流量控制功能
- 拥有拥塞控制功能
-
缺点:
- 实现复杂,性能较低(相比UDP)
- 延迟较高,Tcp偏重于数据的可靠传输
Tcp 的报文格式
要了解Tcp的工作机制,就得先从它的报文格式开始谈起,下图为Tcp的报文格式。
matlab
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 源端口号 | 目的端口号 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 序列号 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 确认号 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 4位 | 保留 | |U|A|P|R|S|F| | |
| 首部 | (6位) | |R|C|S|S|Y|I| | 16位窗口大小 |
| 大小 | | |G|K|H|T|N|N| | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 16位校验和 | 16位紧急指针 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 选项及填充(若有) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 数据 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 端口号:Tcp使用4字节(32bit)来表示源端口和目的端口号,系统会根据端口号的不同来区分连接。
- 序列号:数据的序列号,因为接收的数据顺序可能不一致,所以需要序列号来进行排序。
- 确认号:用于告知发送端已经下一次要收的数据序列。
- 首部大小 :用于确定Tcp的报头长度,计算方式为 首部大小 * 4,也就是说报文头部大小最大为60字节。
- 标志位 :类似于一种信号,使用bit位来标志使用到的标志位。
- URG (Urgent):确定紧急指针是否有效,一般很少用紧急指针的内容。
- ACK (Acknowledge):表明数据已经收到。
- PSH (Push): 告诉系统赶紧把数据取走
- RST (Rest) : 用于重置连接,在
服务器客户端连接认知不一致
的情况使用。 - FIN (Finish):用于4次挥手,表明要结束连接。
- 窗口大小:流量控制机制,用于表明接受方的缓冲区大小。
- 校验和:用于校验数据是否完整。
- 紧急指针:用于标识一个字节的紧急数据的地址(很少用到)。
- 选项:常见的选项有MSS(Maximum Segment Size)------拥塞窗口大小。
三次握手
三次握手是TCP协议进行网络通信时必须要做的一件事情,所有的连接都的要进行三次握手后才能开始传输数据。这是为了确定通信双方能够建立可靠的连接,并且交换双方的信息。
三次握手的过程
- 第一次握手由客户端开始发起,用于确定服务器是否存在。
- 第二次握手是服务器应答请求并发起连接请求,当客户端收到后则客户端对服务器的连接就已经建立完毕。
- 第三次握手是客户端通知服务器建立连接。
连接丢失的情况:
- 第一、二次握手连接丢失:客户端因为没有收到服务器的消息,所以会重新发送报文给服务器。
- 第三次握手连接丢失 :这种情况便是
双方连接认知不一致
,因为客户端会认为服务器端已经收到了报文并且建立了连接。客户端在这种情况下发送数据给服务器端的话,服务器会发送一个带有RESET标志的报文给客户端,重新进行三次握手。
四次挥手
四次挥手是用于安全断开连接的措施。当客户端选择断开连接的时候,服务器端可能还有数据没有传输完毕,所以需要将连接稍微延长,直到数据被完全传输完毕。
- 第一次挥手:表明本地已经没有需要发送的数据,告诉远端准备好断开连接。
- 第二次挥手:远端已经收到FIN信号,返回应答,并继续处理未处理完的数据。
- 第三次挥手:远端已经处理完所有数据,告诉本地已经关闭连接(FIN)。
- 第四次挥手 :本地进行应答,然后进入TIME_WAIT状态,一段时间后结束(CLOSED)。
四次挥手的小细节:
- 四次挥手不像三次握手一样,会造成认知不一致状态。
- 四次挥手有极小概率会变成三次挥手(即当FIN信号到了的时候,数据早已经处理完毕)。
- TIME_WAIT状态的时间是2 * MSL(最大报文生存时间),而这个时间也是Tcp报文在网络的最大生存时间,从而确保网络的延迟报文能够正确接收,避免影响下次复用该端口号时收到未知的报文。
Tcp的滑动窗口机制
概念
Tcp的三次握手中报文的交换是一个接一个的,但如果数据的传输也是如此,势必会让传输的效率遭到大幅度地下降,于是Tcp协议使用了滑动窗口这种机制来让数据高效传输。
滑动窗口传输的细节:
- 滑动窗口通过序列号来将收到的报文规范排列。
- 滑动窗口使用确定序列号来通知远端下一个要接收到报文。
- 确定序列号代表该序列号之前的报文已经全部接收。
- 滑动窗口允许一定的确定报文丢失,因为确定序列号代表之前的报文已经全部接收,只要最后到确定报文到达即可。
超时重传机制
当Tcp发送报文长时间没有得到应答,则会进行超时重连,没有收到应答的原因可能是发送的报文数据在网络传输过程中丢失了,也可能是对端发送的ACK消失了 。无论是哪一种情况,发送方都会重新发送数据给接受端,接受端再根据Tcp报文中的序列号来确定该数据是否已经接收过。
高速重传
我们已经知道滑动窗口是用于提高数据传输的效率的,如果有任意一个报文没收到都要等待这么长时间才能重新接受,那么不就是本末倒置了吗?于是TCP又设置了高速重传机制 ------当连续三个ACK报文的确认序列号都相同时,发送端将重发该序列段的数据。
TCP传输控制机制
流量控制
设想一下,如果你正在下载某个文件,下载速度非常地快,以至于你的硬盘都来不及去读取你下载的内容,而服务器又不停地高速给你发送数据,那么你的系统也只能丢弃这些数据,但这样会造成非常大的网络资源浪费。有没有什么办法能够阻止这种浪费呢?
你是否还记得Tcp报头中有一个窗口大小呢?其实Tcp在进行三次握手和传输数据期间,都会根据双方缓冲区的大小动态更新窗口大小,从而实现流量的控制。
流量控制的小细节:
-
接收端通过接收缓冲区的大小更新滑动窗口大小,然后通过ACK报文通知发送端。
-
窗口大小也是反映网络吞吐量的标准。
-
当接收端窗口大小为0,发送端将停止发送数据一段时间并定时发送窗口探测,直到接收端有能力接受数据。
拥堵控制
慢启动
我们已经知道TCP拥有流量控制功能,滑动窗口能够根据对方的缓冲区(窗口大小)动态调整,但网络环境是复杂的,我们还需要考虑客户端与服务器之间的网络情况 。如果一次发送大量的数据给对方,可能会对网络造成瘫痪。为了防止这种情况的发生,TCP使用了慢启动算法。
-
慢启动 :其实在Tcp协议的内部,还定义了一个叫做拥塞窗口的变量(非窗口),当数据开始进行传输时,这个值被设为1,发送端每收到一个来至接收端的ACK时,拥塞窗口都会呈指数增长。
-
拥堵避免:一旦拥堵窗口达到一定大小(阈值)时便会进入线性增长模式,即每接受一个ACK,拥塞窗口就+1。
-
动态调整: 因为网络的状态总是不稳定的,所以拥塞窗口的阈值会随着网络的丢包/持续传输而动态变化。
滑动窗口大小实际为:min( 窗口大小,拥塞窗口 )。
Tcp的性能优化机制
延迟应答
在文章上方的介绍中,我们都是以发送端每发送一个报文,接收端就返回一个报文来进行通信的,但实际的通信过程中,接收端并不会立刻应答,而是选择等待一段时间,接受多个报文后再回复对方,从而减少网络的压力。
延迟应答的小细节:
- 根据操作系统的不同,可能会在接受到两个报文后直接回复。
- 根据操作系统的不同,延迟发送的时间也会不同,时间越长触发超时重传的概率也就越高,一般操作系统将延迟应答时间设置为0.2秒。
捎带应答
捎带应答其实我们在三次握手中已经见到过了,其实也就是在发送其他数据的时候同时带着应答报文,从而减少应答报文在网络的传输,降低网络压力。
📓总结
TCP协议的设计不仅考虑了连接的可靠性,还考虑到了流量控制、拥堵控制、性能优化等各种方法,相信学习了本文了你,被问到TCP协议的特点时,肯定能侃侃而谈,给对方一个好影响吧。
参考书籍:《图解TCP/IP》