tip:以下都假设客户端是主动方,服务器为被动方。实际情况两者即可能是主动也可能是被动。
TCP(传输控制协议)是作用在传输层的面向连接的传输协议。大多数网页和在线视频都是用的TCP协议。
【问题】什么是“三次握手,四次挥手”?
TCPIP协议给两台设备建立连接要经历三次通信,断开的时候要经历四次通信,这就是”三次握手和四次挥手“。
一. TCP报文
TCP层传输的数据是以报文的形式呈现的,而握手挥手的过程就要用到几个报文里的参数。
-
序列号Seq:发送数据时携带的随机标识
-
确认号Ack:收到数据后,回复发送端的标识,Ack的值一般是Seq号+1之类的形式构成,便于发送端识别连接已确认
-
标识位:定义此次通信的行为是什么
SYN:发起一个新连接,SYN=1表示发起一个新连接
ACK:确认号是否有效,ACK=1表示确认号有效,ACK=0表示报文不含确认号信息
FIN:结束标志,用于释放连接,FIN=1表示关闭本方数据流
二. ”三次握手“
建立连接的三次握手如下图:
seq都为系统取得随机数,这里以字母表示。
过程解析 :
- 第一次握手:客户端发送连接请求SYN=1,seq=J
- 第二次握手:服务器收到连接请求所以回复ACK=1,ack=J+1;同时服务器也向客户端发起连接请求SYN=1,seq=K。
- 第三次握手:客户端收到ACK=1,ack=J+1知道自己的连接成功,并处理了服务器的连接请求SYN=1,seq=K,发送ACK=1,ack=K+1
然后客户端和服务端相互间就建立了连接,完成了TCP三次握手。
【问题】为什么是三次握手而不是两次?
因为客户端服务端双方都要建立连接,如果只有两次的话,服务端就不会能确认它是否连接上了客户端。
三. ” 四次挥手“
过程解析:
- 第一次挥手:客户端发起释放连接请求FIN=1,seq=m
- 第二次挥手:服务器收到请求,回复ACK=1,ack=m+1。客户端收到后为半关闭状态
- 第三次挥手:服务器再发送自己这次被动释放连接的请求FIN=1,ACK=1,ACK=m+1,seq=n
- 第四次挥手:客户端收到释放连接请求,确认请求发送ACK=1ack=n+1。服务端收到后释放连接,经过
2MSL(报文最大生命周期)后客户端也释放连接。
【问题】为什么是四次挥手,而不是两次三次?
客户端因为发送完数据后才开启的释放连接请求,服务器收到后,回复客户端它收到了,但是这时服务器不一定就发完了它的数据,所以客户端要等待服务器发送完数据,服务器再发送释放连接请求,客户端回应后服务器就释放连接了。所以四次挥手是为了被动放传完数据再释放连接。
【问题】为什么最后客户端要等待2MSL后再关闭?
因为客户端担心最后一条报文服务器没有收到,所以要等一段时间后再自己放释放。如果服务器没有收到客户端最后一条ACK报文,会再发送一次FIN请求释放连接报文。