携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第21天,点击查看活动详情 >>
TCP的连接管理
相信各位朋友对计算机网络已经是非常熟悉了,对TCP这个热门知识点也是做到了胸有成竹了。
这里秉着查漏补缺的出发点,我们再来一起学习一下TCP的连接管理。
TCP的三次握手
第一次握手:
在第一次握手中,主动请求连接的客户端会首先向服务端发送SYN报文段,该报文段有以下几点特殊:
- SYN标志位,置 1
- 序号中存放的是TCP随机初始化的序列号 client_isn
第二次握手:
当客户端发送的SYN报文段达到服务端后,服务端会为该TCP连接分配TCP缓存和变量,此后向客户端发送允许连接的报文(ACK报文),允许连接报文中:
- SYN标志位,置1
- 确认号 ack 为 client_isn + 1
- 序号中存放的是服务端TCP随机初始化的序列号 server_isn
第三次握手:
在收到服务端发来的允许连接报文后,客户端也要为该连接分配缓存和变量,此后客户端会再给服务端发送一个确认报文段表示对允许连接报文段的确认。该报文内:
- SYN置 0
- 确认号 ack 为 server_isn + 1
- 可以携带数据
这里需要注意的是,SYN标志位并不是全程都是 1 的,在第三次握手发出的报文内,SYN标志位是 0 的,表示当前连接已经建立;此后的每一个报文段中 SYN标志位都是置零的
TCP的四次挥手
-
假设客户端主动停止连接,向服务端发送了 FIN = 1 的报文;
-
收到该报文之后,服务端会返回一个确认报文,
-
在确保自己也没有数据需要发送给客户端的时候,服务端会向客户端发送 FIN = 1 的报文,并等待确认。
-
客户端在收到来自服务端的 FIN = 1 的报文的时候,会立即返回一个确认报文,并进入了2MSL等待阶段。
在2MSL时间范围内,如果客户端收到服务端超时重传的FIN = 1的报文,则说明刚客户端发出的确认,服务端没有收到,所以此时客户端会重新发送确认并重置计时器;在2MSL之后,没有收到服务端的超时重传的FIN = 1的报文,则客户端正常关闭。服务端在收到确认后也是正常关闭的。
总结
本次通过整体分析把握,和大家一起学习了TCP的三次握手和四次挥手的详细内容。在这里总结一下:其实为什么TCP会有这些繁琐的机制呢?主要是因为TCP是一种可靠传输的协议,它需要通过一些相对复杂的操作来保证数据传输的安全可靠。