TCP
- TCP提供面向有连接的通信传输,面向有连接是指数据通信开始之前先做好两端之间的准备工作。
三次握手
- 三次握手:是指建立一个TCP连接时需要客户端与服务端总共发送三次数据包以确认连接的建立。
- 第一次握手:客户端将同步标志位 SYN 置为1,随机产生一个同步序列号 seq =J,并将该数据包发送给服务端,客户端进入一个 SYN_SENT 状态,等待服务端确认。
- 第二次握手:服务端收到客户端的数据包,服务端将同步标志位 SYN置为1,确认标志位 ACK置为1,确认序列号 ack置为J+1 ,随机产生一个同步序列号 seq=k,发送给客户端以确认连接,自身进入一个 SYN_RCVD 状态。
- 第三次握手:客户端收到服务端的数据包后,校验确认序列号ack是否为 J+1,确认标志位 ACK 是否为 1,都正确则将确认标志位 ACK置为1,确认序列号 ack置为 K+1 发送给服务端,服务端校验确认标志位 ACK是否置为1 ,确认序列号 ack是否为K+1,正确则连接成功,客户端和服务端进入ESTABLISHED状态,随后客户端和服务端即可以传输数据。
四次挥手
- 四次挥手: TCP连接是全双工的,因此每个方向都必须要单独进行关闭,四次挥手即终止TCP连接,指:断开一个TCP连接时,需要客户端和服务端总共发送四次数据包以确认连接的断开。(中断连接,可以是客户端发起,也可以是服务端发起。)
- 第一次挥手:客户端将结束标志位 FIN置为M,用来关闭客户端与服务端的数据传输,数据包发送给服务端。客户端进入 FIN_WAIT_1 状态。意思即为:我客户端没有数据要发送给你了,若你服务端还有数据没有发送完成,则不必着急关闭连接,可以继续发送数据。
- 第二次挥手:服务端收到客户端结束标志位 FIN 数据包,将数据包确认序列号 ack置为M+1 发送给客户端。意思即为:你的关闭请求我收到了,但我还没准备好,请继续等待我的消息。这时客户端进入 FIN_WAIT_2状态,继续等待服务端结束标志位 FIN 的数据包
- 第三次挥手:服务端确认数据传输完毕,则将数据包结束标志位 FIN置为N 发送给客户端。意思即为:服务端数据传输完毕,准备好关闭连接了。服务端进入 LAST_ACK 状态。
- 第四次挥手:客户端收到结束标志位FIN的数据包后,就知道可以关闭连接了,但是怕服务端不知道要关闭,所以将数据包确认标志位 ACK置为1,确认序列号 ack置为N+1,发送给服务端。客户端进入 TIME_WAIT状态 。如果服务器端没有收到ACK则可以重传。服务器端收到ACK后,就知道可以断开连接了(CLOSED状态)。客户端等待了2MSL(时间MSL叫做最长报文寿命,RFC建议设为2分钟)后依然没有收到回复,则证明服务器端已正常关闭,客户端也可以关闭连接了。最终完成了四次握手。
面试常问题
- 为什么要三次握手:两次握手无法保证连接成功,四次握手浪费资源。第三次握手是为了防止已失效的请求报文段突然又传送到了服务端而产生连接的误判。
- 为什么要四次挥手:TCP协议是一种面向连接的、可靠的字节流的传输层协议,TCP是全双工模式,意味着当客户端发起FIN时,仅代表客户端无数据传输,但任能收到服务端发来的数据。
TCP标志位
- SYN:同步标志位。该标志仅在三次握手建立TCP连接时有效。
- ACK:确认标志位。
- RST:复位标志位。用于复位相应的TCP连接,当RST=1时,表面出现严重错误,必须释放连接,然后再重建传输连接。还用来拒绝一个不法的报文段或拒绝打开一个连接。
- URG:紧急标志位。此标志表示TCP包的紧急指针域有效,用来保证TCP连接不被中断,并且督促中间层设备尽快处理这些数据。
- PSH:推标志位。
- FIN:结束标志位。用来释放一个连接,当FIN=1时,表明要发送的字节已发送完,并请求释放传输连接。带有该标志位的数据包用来结束一个TCP回话,但对应端口任处于开发状态,准备接收后续数据。
|