计算机网络知识之三次握手和四次挥手
一、
在传输层使用TCP传输数据之前,
会先以三次握手的形式建立连接,
建立成功以后开始发送数据,
发送完成后以四次挥手的形式来终止连接。
二、
以川航8633与ATC联系举例
(1)
客户端发送SYN(同步)请求建立连接,并且生成seq(序列)。
生成 seq=1000
(2)
服务端在收到客户端请求后,作出回应,回送SYN+ACK给客户端。
生成 seq = 2000 (服务端生成,给客户端回应时进行使用)
ACK = 1001 (是根据客户端发送的seq = 1000基础上+1的) 注:在实际数据传输中,回复的数字不是加1,但是会加上数字,来进行确认。
(3)
客户端在收到服务端的确认以后,也会进行确认。
设置 seq = 1001(刚刚收到的服务端的ACK)
ACK = 2001 (刚刚收到的服务端的seq = 2000基础上+1的)
并且把确认包发送给服务端,表示连接成功,开始传输数据了。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
如果只有两次握手。
(1)
飞机在接到ATC的请讲之后,会继续进行语音发送,但是后续再也没有收到ATC的语音了。
飞机不确定自己的第三句话有没有发送成功。
ATC说完请讲两个字以后,一直在等待飞机那边描述情况,同时也会继续向飞机询问,以便确认语音被飞机收到了。
假设只有两次握手,就进行连接确认,在网络中,客户端如果发送了连接请求,但是一直没有收到服务端的确认。
于是,再发送了一次请求,这次请求正常,使得数据得以传输,过了不久,第一次发送的连接请求发送成功了,原来是延迟了。
于是还是到了服务端那里,如果是两次握手,那么这个时候连接就建立起来了,服务端会一直在等待客户端发送数据,
而实际上,客户端已经把延迟的请求作为无效的处理了,服务端那边就会造成大量的资源浪费。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
连接已建立,客户端出现故障
ATC让飞机下到8400的高度保持,但是飞机的风挡玻璃破裂,没法继续沟通,此时ATC不会一直等下去,间隔一段时间继续呼叫,还会调度其他飞机。
服务端没有收到客户端数据后,间隔一段时间后发送报文进行探测, 在规定的次数后还没有得到客户端的回应,就会关闭连接。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
四次挥手
(1)
假设8633风挡玻璃没有脱落,并且给ATC确认返航。
在网络中,客户端没有数据需要发送了,需要断开连接。
客户端先发送一个FIN+ACK,确认断开连接的请求。
设置 Seq = 2000
Ack = 1000
(2)
服务端收到以后,回送ACK
设置 Seq = 1000(根据发送过来的Ack定义)
Ack = 2001 (根据发送过来的seq = 2000 + 1定义的)
(3)
接着服务端回送FIN+ACK
设置 Seq = 1000(根据发送过来的Ack定义)
Ack = 2001 (根据发送过来的seq = 2000 + 1定义的)
(4)
客户端收到,回送ACK
设置 Seq = 2001 (根据发送过来的Ack定义)
Ack = 1001(根据发送过来的seq = 1000 + 1定义的)
这样就关闭了连接,完成了通讯。
注意:不能是三次挥手,因为连接一旦建立了起来,两边既是发送也是接收,
如果一方不发送了但仍然可以接收也不能突然断开连接,要等另一方真的把数据都传输完,才能愉快地结束玩耍。
https://www.bilibili.com/video/BV1h7411A7tG
欢迎大家关注我的微信公众号,获取你不知道的宝藏。