我终于搞懂了TCP的三次握手和四次挥手(图片案例超详解)

我终于搞懂了TCP的三次握手和四次挥手(图片案例超详解)本篇超级详细的讲解了TCP三次握手和四次挥手!欢迎阅读学习交流!

大家好,又见面了,我是你们的朋友全栈君。

【辰兮要努力】:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行!

博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端、后台、数据库、项目案例等相关知识点总结,感谢你的阅读和关注,希望我的博客能帮助到更多的人,分享获取新知,大家一起进步!

吾等采石之人,应怀大教堂之心,愿你们奔赴在各自的热爱中…


一.TCP基础入门

1、TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的通信协议,数据在传输前要建立连接,传输完毕后还要断开连接。
2、客户端在收发数据前要使用 connect() 函数和服务器建立连接。建立连接的目的是保证IP地址、端口、物理链路等正确无误,为数据的传输开辟通道。
3、TCP建立连接时要传输三个数据包,俗称三次握手(Three-way Handshaking)

在这里插入图片描述
?☕️??????


二.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:断开一个连接。


三.TCP的三次握手

?过程描述

①首先 Client 端发送连接请求报文

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

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

在这里插入图片描述

☕️用川航举例子

①四川8633请求建立连接(SYN),并且发送出序号。
②服务端接受到信号,即有确认号(ACK),此时并同样返回请求序号Seq
③客户端接受到信号,即有确认号(ACK),连接已经建立。
在这里插入图片描述
小结三次握手的关键是要确认对方收到了自己的数据包,这个目标就是通过“确认号(Ack)”字段实现的。计算机会记录下自己发送的数据包序号Seq,待收到对方的数据包后,检测“确认号(Ack)”字段,看Ack = Seq + 1是否成立,如果成立说明对方正确收到了自己的数据包


?如果只有两次握手 这个时候客户端没有回应,这样会浪费服务端的资源

在这里插入图片描述

?那你是否思考过为什么需要第三次通信 ?

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

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

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

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


四.TCP的四次挥手

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

//过程描述

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

在这里插入图片描述

数据传输完毕后,双方都可释放连接。最开始的时候,客户端和服务器都是处于ESTABLISHED状态,然后客户端主动关闭,服务器被动关闭。


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

  • 因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。
  • 但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。
  • 只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

补充问题

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

?推荐阅读

Java面试总结:点击进入 Java面试专栏 关注走一波

Java基础知识:点击进入 Java基础总结 关注走一波

Java项目专栏:点击进入 Java毕设专栏 关注走一波


?The best investment is in yourself.

?非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞? 关注❤️ 分享? 留言?thanks!!!

2020.03.19 来自辰兮的第32篇博客

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/136970.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • dnf钓鱼网站不小心点开了_dnf易语言源码

    dnf钓鱼网站不小心点开了_dnf易语言源码其实本人当时也没注意很多。就按下了“点此充值”注意!这个所谓的登录根本不是TX的登录,其实就是用一个表单将你的帐号和密码发给盗号的!当你打完帐号密码后按下那个“登录”按钮,你的帐号密码已经到了盗号的手里,不过,他们还差一步,才能将你的号彻底洗干净,那就是你的绑定手机和手机令牌、二级密码。好吧,草了个蛋,这是个.net的页面。继续,当你打完你的号码以后不按“登录”,好吧,我解释一下,因为盗号的人不需…

    2022年8月24日
    7
  • 《大话数据结构》目录[通俗易懂]

    《大话数据结构》目录[通俗易懂]由于目录中有比较复杂的格式,所以只能用PDF的形式提供。http://files.cnblogs.com/cj723/%E7%9B%AE%E5%BD%95.pdf

    2022年6月24日
    35
  • python操作内存数据_python重点知识

    python操作内存数据_python重点知识python基础知识-7-内存、深浅、文件操作

    2022年4月21日
    34
  • pycharm如何连接远程服务器_pycharm如何使用远程解释器

    pycharm如何连接远程服务器_pycharm如何使用远程解释器pycharm提供了很方便的与服务器同步代码,并执行的插件。我在配置的时候遇到了个问题,后来折腾了两天,最后终于解决了,在此记录下配置的过程和怎么解决的。目的:pycharm连接远程的服务器,然后在本地写代码,自动提交服务器并且在服务器执行,结果显示在本地console。坑:设置ssh的配置没问题,本地与远程项目也同步了,远程的python解释器也指定了,但是跑代码遇到无法连接到远程con…

    2022年8月26日
    5
  • 安装windows7导致Ubuntu启动项消失的问题的解决

    安装windows7导致Ubuntu启动项消失的问题的解决

    2022年1月24日
    53
  • 基于IP路由的GSLB《CDN技术详解》

    基于IP路由的GSLB《CDN技术详解》基于IP路由的GSLB是基于路由器原有的路由算法和数据包转发能力工作的。如图所示,有两个本地均衡器1和2,放在不同的POP点中,负责各自POP点内的服务器的负载均衡。先为这两个本地均衡器配置一个相同的VIP地址,对IP网上的路由器来说,这是到同一个IP地址的两条不同的路由。1)当终端a输入URL访问网站时,DNS系统会把VIP作为域名解析结果反馈给终端。2)终端向这个VIP发送请求时,请求数…

    2022年5月22日
    46

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号