一、TCP的连接与断开
-
TCP是面向连接的,每次发送数据之前都要和对方建立一条可靠的连接,这个建立连接的过程分为三个步骤,因此称为三次握手
-
连接的完成必然会有断开,因此断开被称之为四次挥手
1、TCP的三次握手
第一次:当客户端向服务器发送请求连接的报文时
- seq序列号=x(x为随机)
- SYN=1(表示发送连接请求)
第二次:服务器端收到客户端发来的请求报文后,同意建立连接,则向客户端发送确认报文
- seq序列号=y(这时服务器也会产生一个序列号y,和客户端的序号不相关)
- Ack确认号=x+1 (seq序列号x+1,表示确认收到了客户端的请求)
- ACK=1(表示这是条确认请求)
- SYN=1 (同时也发送一个建立连接的请求)
第三次:客户端进程收到服务端进程的确认后,还要向服务端给出确认,然后连接成功建立
- seq序列号=x+1(这时客户端的序号为1)
- Ack确认号=y+1(表示确认收到了服务器的连接请求)
- ACK=1(表示这是确认报文)
简版
pc1向pc2建立连接
- pc1申请向pc2发送建立连接请求
- pc2同意pc1的连接请求,并向pc1请求连接(因为连接是双向的)
- pc1收到,回复pc2同意连接
2、TCP的四次挥手
第一次:当客户端向服务器发送断开连接请求时
-
FIN=1(表示发送断开请求)
-
ACK=1(表示确认断开)
第二次:服务器收到客户端的请求时回复确认消息
- ACK=1(表示确认断开)
第三次:服务器再次向客户端发送断开连接请求
-
FIN=1(表示发送断开请求)
-
ACK=1(表示确认断开)
第四次:客户端收到请求后回复确认消息
- ACK=1(表示确认断开)
简版
pc1向pc2申请断开连接请求
- pc1向pc2发送断开请求
- pc2同意pc1的请求,并回复确认消息(这时pc1单方面断开连接,为了防止有些数据未完成pc2会继续保持与pc1的连接)
- pc2再次向pc1发送断开请求
- pc1同意并回复确认消息(pc2与pc1断开连接)
二、TCP的一些问题
1、为什么是三次握手而不是两次呢
-
主要是为了防止已经失效的连接请求报文突然又传送到了服务器,从而导致不必要的错误和资源的浪费。
-
两次握手只能保证单向连接是畅通的。因为TCP是一个双向传输协议,只有经过第三次握手,才能确保双向都可以接收到对方的发送的数据。
参考来源:TCP协议为什么是三次握手而不是两次呢?
2、为什么是四次挥手而不是三次
-
TCP是双向通讯协议,客户端发送FIN到服务端,告诉服务端,客户端不会再发送数据了,但是服务端还有消息未发送完毕,为防⽌客户端消息等待,服务端会⾸先发送ACK确认字符到客户端,并关闭消息接收服务。但是服务端会将剩余消息发送完毕,然后发送FIN到客户端,告诉客户端不会再发送消息,然后客户端会回复ACK表⽰收到,并关闭服务,当服务端收到ACK后,验证正常则会关闭所有的服务,TCP连接中断完毕。
参考来源链接:TCP的四次挥手为什么不是三次