TCP连接之三次握手四次挥手

本文参考链接: 我终于搞懂了TCP的三次握手和四次挥手(图片案例超详解)

1 TCP基础入门

   1、TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的通信协议,数据在传输前要建立连接,传输完毕后还要断开连接。

   2、客户端在收发数据前要使用 connect() 函数和服务器建立连接。建立连接的目的是保证IP地址、端口、物理链路等正确无误,为数据的传输开辟通道。

  3、TCP建立连接时要传输三个数据包,俗称三次握手(Three-way Handshaking)断开连接时要传输四个数据包,又被称为四次挥手。

在这里插入图片描述

1.1 TCP数据报结构

在这里插入图片描述①序号:Seq(Sequence Number)序号占32位,用来标识从计算机A发送到计算机B的数据包的序号,计算机发送数据时对此进行标记。
②确认号:Ack(Acknowledge Number)确认号占32位,客户端和服务器端都可以发送,Ack = Seq + 1。
③标志位:每个标志位占用1Bit,共有6个,分别为 URG、ACK、PSH、RST、SYN、FIN,具体含义如下:

   URG:紧急指针(urgent pointer)有效。
   ACK:确认序号有效。
   PSH:接收方应该尽快将这个报文交给应用层。
   RST:重置连接。
   SYN:建立一个新连接。
   FIN:断开一个连接

2 三次握手

2.1 过程描述

在这里插入图片描述
①首先 Client 端发送连接请求报文

②Server 段接受连接后回复 ACK 报文,并为这次连接分配资源。

③Client 端接收到 ACK 报文后也向 Server 段发生 ACK 报文,并分配资源,这样 TCP 连接就建立了。

用川航举例子
在这里插入图片描述
①四川8633请求建立连接(SYN),并且发送出序号。
②服务端接受到信号,即有确认号(ACK),此时并同样返回请求序号Seq
③客户端接受到信号,即有确认号(ACK),连接已经建立。

总结:三次握手的关键是要确认对方收到了自己的数据包,这个目标就是通过“确认号(Ack)”字段实现的。计算机会记录下自己发送的数据包序号Seq,待收到对方的数据包后,检测“确认号(Ack)”字段,看Ack = Seq + 1是否成立,如果成立说明对方正确收到了自己的数据包。

2.2 为什么是三次握手

在这里插入图片描述
如果只有两次握手 这个时候客户端没有回应,并不知道客户端有没有成功接收到服务端的消息。

为什么需要第三次通信 ?

1、在第一次通信过程中,A向B发送信息之后,B收到信息后可以确认自己的收信能力和A的发信能力没有问题。

2、在第二次通信中,B向A发送信息之后,A可以确认自己的发信能力和B的收信能力没有问题,但是B不知道自己的发信能力到底如何,所以就需要第三次通信。

3、在第三次通信中,A向B发送信息之后,B就可以确认自己的发信能力没有问题。

4、 小结:3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。

3 四次握手

   建立连接非常重要,它是数据正确传输的前提;断开连接同样重要,它让计算机释放不再使用的资源。如果连接不能正常断开,不仅会造成数据传输错误,还会导致套接字不能关闭,持续占用资源,如果并发量高,服务器压力堪忧。

3.1 过程描述

A:“任务处理完毕,我希望断开连接。”
B:“哦,是吗?请稍等,我准备一下。” 等待片刻后……
B:“我准备好了,可以断开连接了。”
A:“好的,谢谢合作。”

在这里插入图片描述

第一次挥手:Clien发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。

第二次挥手:Server收到FIN后,发送一个ACK给Client,Server进入CLOSE_WAIT状态。

第三次挥手: Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。

第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,发送ACK给Server,Server进入CLOSED状态,完成四次握手。

川航图举例
在这里插入图片描述

①客户端申请断开连接即FIN (我这边准备断开连接了)
②服务端接收信息返回,表示我已经接收到 (收到,请稍等,我这边准备一下)
③服务端发送信息表示可以断开连接 (我准备好了,你可以断开连接了)
④客户端接受信息,同时返回信息通知服务端自己收到信息,开始断开 连接(好的,拜拜!)

3.2 为什么连接的时候是三次握手,关闭的时候却是四次握手?

①因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。

②但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。

③只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

总的来说就是当Server端收到FIN报文时,Server端此时数据还没传输完成,无法立即关闭SOCKET,但是也不能等到数据传输完成之后再回复,这样的话Client端也不知道自己发送的消息到底有没有被收到,不可能一直等下去.所以Server端会先回复一个收到关闭连接的消息.等到所有数据都传输完成了,再回复一个开始关闭连接的消息。

4 补充思考

TCP的三次握手一定能保证传输可靠吗?
    不能百分百保证,因为可能最后一次握手之后,客户端在发送玩最后一条握手消息后就崩溃了,此时服务器还以为客户端是正常的。

    追加更多次握手也不能使连接更可靠了。因此选择了三次握手。世界上不存在完全可靠的通信协议。从通信时间成本空间成本以及可靠度来讲,选择了“三次握手”作为点对点通信的一般规则。

    同样的四次挥手也是同理,软件开发任何时候都不能保证百分百的正确性,即使软件程序是正常的,也很难保证物理机不出意外。所以每次看到三次握手和四次挥手的时候就不得不感叹前人的智慧,用最少的逻辑保证程序的尽可能最大的可靠性,软件开发的魅力就在于此。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值