计算机网络知识之三次握手和四次挥手

一、

 

 

 

在传输层使用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

 

欢迎大家关注我的微信公众号,获取你不知道的宝藏。

 

posted @ 2020-03-25 11:05  代码改变我的世界  阅读(411)  评论(0编辑  收藏  举报