计算机网络:传输控制协议(Transmission Control Protocol-TCP协议)
- 本文目的
- 前置知识点
- TCP协议简介
- 主要特性
- 通信流程
- 1. 建立连接的过程(三次握手,243)
- 1.1 为什么要三次握手,两次不行吗?
- 2. 释放连接的过程(四次挥手,3343)
- 2.1 TIME-WAIT时间等待状态是做什么的?
- 参考文献
本文目的
介绍TCP协议的内容,三次握手和四次挥手的必要性和原因
前置知识点
- 计算机网络基本知识。
TCP协议简介
全称Transmission Control Protocol,传输控制协议,运输层协议。
主要特性
参考《计算机网络》传输层协议TCP概述p211
- 面向连接的运输层协议,传输前需要简历TCP连接
- 每一条TCP协议都是点对点通信的
- 提供可靠交付的数据,通过TCP连接传输的数据无差错,不丢失,不重复
- 全双工通信
- 面向字节流
通信流程
1. 建立连接的过程(三次握手,243)
需要阐明为什么每次交互会有这些标志位。
图解如下
- 最开始客户端和服务器都处于关闭状态
- 服务器创建传输控制块(TCB,Transmit Control Block),进入绑定自己的ip和端口进入监听(listen)状态。
- 客户端创建TCB,已知服务器的ip和端口,向服务器发出连接请求报文,包括以下内容:(发送后进入同步已发送SYN_SENT状态)
- SYN(SYNchronization)同步序号置1,表示这是一个连接请求报文。
- seq初始序号x,该报文不携带数据但是需要消耗一个初始序号,也是服务器应答的依据(服务器需要应答x+1这样客户端才知道刚刚那条报文发过去了)
- 服务器收到连接请求报文之后,如同意连接,返回确认报文段,包含以下内容:(发送后进入同步收到SYN_RCVD状态)
- SYN同步序号置1,表示这是一个连接接受报文段。
- seq初始序号y,同样的需要小号一个初始序号,也是客户端应答的依据。
- 确认ACK = 1,ACK= 1的时候确认号字段(ack)才有效,建立连接后所有的报文段都要把ACK置1。
- 确认号ack = x + 1,期望对方下一个报文段第一个字节的序号,表示x之前的数据都收到了。
- 客户端收到连接确认报文之后,还要再给B发出确认,包含以下内容:(同时客户端已进入连接建立ESTABLISHED状态)
- ACK = 1,seq = x + 1, ack = y + 1。
- 可以包含数据,如果不包含则不消耗x + 1这个序列号。
- 服务器收到之后进入连接建立ESTABLISHED状态,三次握手建立成功。
1.1 为什么要三次握手,两次不行吗?
参考《计算机网络》5.9 TCP的运输连接管理p239
两次握手可以避免已失效的连接请求报文段,客户端发送给服务器但是延迟送达,对于客户端来说早已失效(过期了),而且失效之后客户端没有再重发请求,但是服务器响应并且发回确认报文段,如果两次握手,服务器此时就开始建立连接,而客户端根本不会相应确认报文段,所以没连接,服务器就会干等消耗资源。
其他情况理论上都可以被三次握手解决。试图举反例举不出来。
2. 释放连接的过程(四次挥手,3343)
- 最开始客户端和服务器都处于ESTABLISHED状态
- 客户端发完要发的消息之后,需要释放连接,发出连接释放报文,包含以下内容:(同时进入终止等待1-FIN-WAIT-1状态)
- FIN = 1,表示是一个连接释放报文
- seq = u,释放报文需要消耗一个序号。
- ACK = 1,理由同连接的时候一致。
- 服务器收到连接释放报文之后需要立刻应答,表示收到了连接释放报文,包含以下内容:(同时进入关闭等待-CLOSE-WAIT状态)
- ACK = 1
- ack = u + 1
- seq = v,需要消耗一个序号
- 客户端收到之后进入终止等待2-FIN-WAIT-2状态,可能服务器还有一些消息要发,这个阶段如果服务器发消息,客户端也要接着收。这个时候TCP称之为半关闭状态。
- 服务器也发完消息之后,发送连接释放报文,包含以下数据:(同时进入最后确认-LAST-ACK状态)
- FIN = 1,表示释放连接报文
- seq = w,因为因为可能半关闭期间发了些消息,所以不是v + 1。
- ack = u + 1不变,因为客户端没发过消息了。
- ACK = 1。
- 客户端收到之后,发送最后确认,包含以下内容:(然后进入时间等待-TIME-WAIT状态)
- ACK = 1
- ack = w + 1
- seq = u + 1
- 服务器收到之后就可以关闭连接了
- 客户端TIME-WAIT结束后也会断开连接。
2.1 TIME-WAIT时间等待状态是做什么的?
参考《计算机网络》5.9.2 TCP的连接释放p240
避免最后一个客户端发出的ACK报文丢失带来的问题。
时间等待计时器TIME-WAIT timer 是2MSL(Maximum Segment Lifetime)最长报文段寿命
- 当最后一个报文丢失(超过了MSL)的时候,服务器收不到会卡在最后确认-LAST-WAIT状态,这个时候服务器可能会重新发送连接释放报文,客户端需要保证能收到,才有可能再次发送最后确认的报文。一来一回刚好是两倍的MSL。
- 保证本次通信的所有报文都消失(2MSL之后肯定都消失了),防止旧的包干扰下一次连接
- 个人理解不一定对:假设第一次发了两次连接请求,但是有一个卡在路上了,然后关闭了,然后卡在路上的那个又到服务器了,其实服务器是可以不用理的
参考文献
《计算机网络》传输层协议TCP概述p211
《计算机网络》5.9 TCP的运输连接管理p239
《计算机网络》5.9.2 TCP的连接释放p240