漫画:一招学会TCP的三次握手和四次挥手

Python多线程爬虫实战:生产者-消费者模型高效抓取XKCD漫画 网络爬虫是数据采集的核心技术,其核心原理是通过程序模拟浏览器请求,自动抓取并解析网页数据。在I/O密集型任务中,单线程爬虫因网络等待导致效率低下,多线程技术通过并发执行能显著提升CPU利用率与抓取速度。Python的threading模块结合生产者-消费者模型,实现了任务分发与执行的解耦,通过线程安全的Queue管理任务队列,有效避免了资源竞争问题。这种架构特别适用于图片、文档等批量下载场景,例如构建本地漫画库或商品图集。本文以XKCD中文站为案例,详细解析了多线程爬虫中线程安全与异常处理的关键实现,帮助开 阅读详情

TCP三次握手和四次挥手的问题在面试中是最为常见的考点之一。很多读者都知道三次和四次,但是如果问深入一点,他们往往都无法作出准确回答。

本篇尝试使用动画来对这个知识点进行讲解,期望读者们可以更加简单地地理解TCP交互的本质。

image

TCP/IP代表传输控制协议/网际协议,指的是一系列协组。

可分为四个层次:

  • 1、数据链路层、网络层、传输层和应用层。

  • 2、 在网络层:有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。

  • 3、在传输层:中有TCP协议与UDP协议。

  • 4、在应用层:有FTP、HTTP、TELNET、SMTP、DNS等协议。

TCP和UDP使用IP协议从一个网络传送数据包到另一个网络。把IP想像成一种高速公路,它允许其它协议在上面行驶并找到到其它电脑的出口。TCP和UDP是高速公路上的“卡车”,它们携带的货物就是像HTTP,文件传输协议FTP这样的协议等。

TCP和UDP是FTP,HTTP和SMTP之类使用的传输层协议。虽然TCP和UDP都是用来传输其他协议的,它们却有一个显著的不同:TCP提供有保证的数据传输,而UDP不提供。这意味着TCP有一个特殊的机制来确保数据安全的不出错的从一个端点传到另一个端点,而UDP不提供任何这样的保证。

TCP 三次握手

TCP 三次握手就好比两个人在街上隔着50米看见了对方,但是因为雾霾等原因不能100%确认,所以要通过招手的方式相互确定对方是否认识自己。

image

相互拥抱

image

我们看到这个过程中一共是四个动作,招手–点头微笑–招手–点头微笑。其中连续进行了2个动作,先是点头微笑(回复对方),然后再次招手(寻求确认),实际上可以将这两个动作合一,招手的同时点头和微笑(syn+ack)。于是四个动作就简化成了三个动作,招手–点头微笑并招手–点头微笑。这就是三次握手的本质,中间的一次动作是两个动作的合并。

我们看到有两个中间状态,syn_sent和syn_rcvd,这两个状态叫着「半打开」状态,就是向对方招手了,但是还没来得及看到对方的点头微笑。syn_sent是主动打开方的「半打开」状态,syn_rcvd是被动打开方的「半打开」状态。客户端是主动打开方,服务器是被动打开方。

  • syn_sent: syn package has been sent

  • syn_rcvd: syn package has been received

TCP 数据传输

TCP 数据传输就是两个人隔空对话,差了一点距离,所以需要对方反复确认听见了自己的话。

image

客户端喊了一句话(data),接收方听见了之后要回复自己听见了(ack)。

如果喊了一句,半天没听到对方回复,就认为自己的话被大风吹走了,没听见,所以需要重新喊话,这就是tcp重传。

也有可能是服务端听到了客户端的话,但是Server向Client的回复被大风吹走了,以至于Client没听见Server的回复。Client并不能判断究竟是自己的话被大风吹走了还是Server的回复被大风吹走了,Client也不用管,重传一下就是。

image

Client可以向Server喊话,同样Server也可以向Client喊话,因为tcp链接是「双工的」,双方都可以主动发起数据传输。不过无论是哪方喊话,都需要收到对方的确认才能认为对方收到了自己的喊话。

Client可能是个高射炮,一说连说了八句话,这时候Server可以不用一句一句回复,而是连续听了这八句话之后,一起向对方回复说前面你说的八句话我都听见了,这就是批量ack。但是Client也不能一次性说了太多话,Server的脑子短时间可能无法消化太多,两人之间需要有协商好的合适的发送和接受速率,这个就是「TCP窗口大小」。

TCP三次连接总结

(1**) 第一次握手:**建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。

**(2) 第二次握手:**服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。

**(3) 第三次握手:**客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。

image

完成三次握手,客户端与服务器开始传送数据。

TCP 四次挥手

TCP断开链接的过程和建立链接的过程比较类似,只不过中间的两部并不总是会合成一步走,所以它分成了4个动作,Client挥手(fin)——Server伤感地微笑(ack)——Server挥手(fin)——Client伤感地微笑(ack)。

image

之所以中间的两个动作没有合并,是因为tcp存在「半关闭」状态,也就是单向关闭。Client已经挥了手,可是人还没有走,只是不再说话,但是耳朵还是可以继续听,Server呢继续喊话。等待Server累了,也不再说话了,超Client挥了挥手,Client伤感地微笑了一下,才彻底结束了。

image

上面有一个非常特殊的状态time_wait,它是主动关闭的一方在回复完对方的挥手后进入的一个长期状态,这个状态标准的持续时间是4分钟,4分钟后才会进入到closed状态,释放套接字资源。不过在具体实现上这个时间是可以调整的。

它就好比主动分手方要承担的责任,是你提出的要分手,你得付出代价。这个后果就是持续4分钟的time_wait状态,不能释放套接字资源(端口),就好比守寡期,这段时间内套接字资源(端口)不得回收利用。

它的作用是重传最后一个ack报文,确保对方可以收到。因为如果对方没有收到ack的话,会重传fin报文,处于time_wait状态的套接字会立即向对方重发ack报文。

同时在这段时间内,该链接在对话期间于网际路由上产生的残留报文(因为路径过于崎岖,数据报文走的时间太长,重传的报文都收到了,原始报文还在路上)传过来时,都会被立即丢弃掉。4分钟的时间足以使得这些残留报文彻底消逝。不然当新的端口被重复利用时,这些残留报文可能会干扰新的链接。

4分钟就是2个MSL,每个MSL是2分钟。MSL就是maximium segment lifetime——最长报文寿命。这个时间是由官方RFC协议规定的。至于为什么是2个MSL而不是1个MSL,我还没有看到一个非常满意的解释。

四次挥手也并不总是四次挥手,中间的两个动作有时候是可以合并一起进行的,这个时候就成了三次挥手,主动关闭方就会从fin_wait_1状态直接进入到time_wait状态,跳过了fin_wait_2状态。

TCP四次分手总结

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

image

  1. **客户端A发送一个FIN,**用来关闭客户A到服务器B的数据传送(报文段4)。

  2. 服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。

  3. 服务器B关闭与客户端A的连接,发送一个FIN给客户端A(报文段6)。

  4. 客户端A发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。

总结

TCP状态转换是一个非常复杂的过程,本文仅对一些简单的基础知识点进行了类比讲解。关于TCP的更多知识还需要读者去搜寻相关技术文章进入深入学习。如果读者对TCP的基础知识掌握得比较牢固,高级的知识理解起来就不会太过于吃力。

补充

最近作为面试管在面试的时候,发现很多人框架很强,java基础的时候就有些薄弱了,很多童鞋们对于HTTP、TCP、UDP以及SOCKET的概念不是很清楚,傻傻的分不清楚,这里我们也简单的提一下

HTTP本身就是一个协议,是从Web服务器传输超文本到本地浏览器的传送协议。

HTTP(超文本传输协议)是利用TCP在两台电脑(通常是Web服务器和客户端)之间传输信息的协议。客户端使用Web浏览器发起HTTP请求给Web服务器,Web服务器发送被请求的信息给客户端。

HTTP协议是建立在请求/响应模型上的。首先由客户建立一条与服务器的TCP链接,并发送一个请求到服务器,请求中包含请求方法、URL、协议版本以及相关的MIME样式的消息。服务器响应一个状态行,包含消息的协议版本、一个成功和失败码以及相关的MIME式样的消息。

HTTP/1.0为每一次HTTP的请求/响应建立一条新的TCP链接,因此一个包含HTML内容和图片的页面将需要建立多次的短期的TCP链接。一次TCP链接的建立将需要3次握手。

另外,为了获得适当的传输速度,则需要TCP花费额外的回路链接时间(RTT)。每一次链接的建立需要这种经常性的开销,而其并不带有实际有用的数据,只是保证链接的可靠性,因此HTTP/1.1提出了可持续链接的实现方法。HTTP/1.1将只建立一次TCP的链接而重复地使用它传输一系列的请求/响应消息,

因此减少了链接建立的次数和经常性的链接开销。

虽然HTTP本身是一个协议,但其最终还是基于TCP的。

SOCKET:TCP/IP网络的API。

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

Socket 接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,用以开发TCP/IP网络上的应用程序。

这是为了实现以上的通信过程而建立成来的通信管道,其真实的代表是客户端和服务器端的一个通信进程,双方进程通过socket进行通信,而通信的规则采用指定的协议。socket只是一种连接模式,不是协议,tcp,udp,简单的说(虽然不准确)是两个最基本的协议,很多其它协议都是基于这两个协议如,http就是基于tcp的,用socket可以创建tcp连接,也可以创建udp连接**,这意味着,用socket可以创建任何协议的连接,因为其它协议都是基于此的。

image

**综上所述:**需要IP协议来连接网络;TCP是一种允许我们安全传输数据的机制,使用TCP协议来传输数据的HTTP是Web服务器和客户端使用的特殊协议。HTTP基于TCP协议,但是却可以使用socket去建立一个TCP连接。

更多参考

Android插件包换肤(高仿网易云音乐换肤)

Android中Application是单例,正确吗?

Android App瘦身新姿势——Android App Bundle

关于Java中的不可变性

欢迎关注公众号 :你说神码,id:info1024Q ,一起交流 和学习技术
你说神码

可以TCP方式,也可以以UDP方式传输RTP包.rar RTSP协议传输视频,可以以TCP方式,也可以以UDP方式,最终可以在VLC等工具中查看视频。 立即下载

相关推荐

Rust嵌入式开发环境搭建指南(基于Stm32+Vscode)

本文档旨在指导开发者如何搭建基于Rust语言的STM32嵌入式开发环境。相比传统的C/C++开发方式,Rust提供了更强的内存安全保障和现代化的语言特性,非常适合嵌入式系统开发。本指南将详细介绍从环境搭建到项目配置的全过程,特别关注VSCode作为IDE的配置以及STLink和DAPLink调试器的使用。

u014627020的博客 2601

TCP 三次握手和四次挥手

当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了TCP连接。第三次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己发送、接收正常,对方发送、接收正常。第二次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:对方发送正常,自己接收正常。服务器-收到这个 FIN,它发回一 个 ACK,确认序号为收到的序号加1。Server 确认了对方发送正常,自己接收正常。(图片来源:《图解HTTP》)。

weixin_62988359的博客 5925

[统计模型] 基于R的潜在剖面分析(LPA)

本文主要介绍基于R进行潜在剖面分析(Latent Profile Aanalysis, LPA)。 关于潜在类别分析LCA/潜在剖面分析LPA的概念和区别,可以参考一下这篇文章: 潜在类别分析LCA \潜在剖面分析LPA介绍https://www.jianshu.com/p/4c830094131e?utm_campaign=maleskine 但是此文对潜类别分析的阐释还比较生涩,而且没有具体的代码编写、模型优选等内容。本文旨在丰富LPA的内容,并希望和大家交流、共同进步。 1. 什么是潜类别分.

bigstar863的博客 1万+

码仔漫画 | TCP的三次握手

1、三次握手才可以阻止重复历史连接的初始化(主要原因) 2、三次握手才可以同步双方的初始序列号 3、三次握手才可以避免资源浪费 如图:客户端连续发送多次 SYN 建立连接的报文,在网络拥...

陈宇明 405

Python OpenCV基于颜色通道分离法去除图片中的红色印章

最近一段时间的工作都是研究如何去除图片中的红色印章,在网上查找了大量的大佬写过的方法,发现大多数是采取颜色通道分离法来做,并且效果还不错。站在前人的肩膀上,我又做了些许调整,谈不上是改进,但是能应对更对的情况总还是好的,特此记录。 拿发票做例子,印章相较于其它部分最大的不同就是印章是红色的,而其它部分不是(这是一句废话)。 那么第一步当然就是将红色分离出来,这一步可以采用Python第三方库OpenCV里的 cv2.split()方法,该方法是把RGB图像的三个通道拆分开来,得...

wl_Honest的博客 1万+

LangChain与SkillLite集成:AI Agent安全沙箱实践

在AI与自动化技术领域,安全沙箱是实现可信计算的核心机制。其原理是通过资源隔离与权限控制,构建受限的执行环境。技术价值在于平衡功能开放性与系统安全性,尤其适用于处理用户提交的非受信代码或敏感数据。典型应用场景包括AI插件系统、在线代码评测平台等。本文以LangChain框架与SkillLite沙箱的深度集成为例,详解如何通过命名空间隔离、cgroups限制等机制,为AI Agent赋予安全执行动态技能的能力。其中涉及的关键技术点包括Python运行时隔离、动态资源配额管理,以及如何防范Shell注入等常见攻

weixin_34189116的博客 405

漫画图解:TCP三次握手就像交朋友

首先,它需要确认收到了客户端的起始序列号,所以它会发送一个ACK(确认)标志位的数据包,并带上“确认号=客户端序列号+1”(意思是:“你从100开始讲的故事,我期待听到第101页”)。通常的流程是:你先拨通电话,说“喂,你好,我是小明”,对方听到后回应“哦,小明你好,我是小红”,然后你可能再确认一下“好的小红,那我开始说正事了”。客户端会生成一个随机的序列号(比如,我们把它想象成“我的故事将从第100页开始讲”),然后向服务器发送一个设置了SYN标志位的数据包,相当于说:“嗨,服务器,你在吗?

EmeraldWolf23的博客 40

Material Studio中分子动力学模拟得到密度density和溶解度参数

使用sketh工具画出全原子分子,以异辛烷为例子。

handsome213的博客 7315

漫画 | 理解了TCP连接的实现以后,客户端的并发也爆发了!

在INET_MATCH中将网络包tcp header中的__saddr、__daddr、__ports和Linux中的socket中inet_portpair、inet_daddr、inet_rcv_saddr进行对比。哪怕两条连接用的是同一个端口号,只要客户端ip不一样,或者是服务器不一样都不影响内核正确寻找到对应的连接,而不会串线!一旦bind之后,内核建立连接的时候就不会选择用过的端口了。“其中skc_addrpair记录的是TCP连接里的IP对儿,skc_portpair记录的是端口对儿。

sunheng9526的博客 203

【产品经理修炼之道】-如何搭建企业级账务系统?

笔者公司的业务模式具有一定的独特性,不同于我们常见的市面上供应链类公司的进销存模式。公司主要为各大银行和金融机构提供信贷领域的风控服务,客户主要通过请求公司的数据产品接口产生费用,可以简单地理解为请求一次接口收费0.5元,一个月若是有1w人请求同一个接口则公司需要收费5000元。

xiaoli8748的专栏 5404

高云FPGA系列教程(1):FPGA和ARM开发环境搭建

至此,高云FPGA和MCU开发环境就搭建完成了,整体还是比较简单的,几乎是一键完成,下一篇文章我们进行实际的FPGA和MCU开发。本文是高云FPGA系列教程的第1篇文章。

whik1194的博客 6185

漫画学JAVA,漫画:一招学会TCP的三次握手和四次挥手

TCP三次握手和四次挥手的问题在面试中是最为常见的考点之一。很多读者都知道三次和四次,但是如果问深入一点,他们往往都无法作出准确回答。本篇尝试使用动画来对这个知识点进行讲解,期望读者们可以更加简单地地理解TCP交互的本质。 TCP/IP代表传输控制协议/网际协议,指的是一系列协组。可分为四个层次:1、数据链路层、网络层、传输层和应用层。2、在网络层:有IP协议、ICMP协议、ARP协议、RAR...

weixin_42138139的博客 346

安全监控:人员行为分析_(2).人员行为分析基础理论

人员行为分析是指利用计算机视觉技术对视频中的人类行为进行实时或离线检测、识别和理解的过程。视频采集:通过摄像头等设备获取视频数据。视频预处理:对视频数据进行噪声过滤、图像增强等处理,以便后续分析。特征提取:从视频中提取出与人员行为相关的特征,如人体姿势、动作轨迹等。行为识别:利用机器学习或深度学习模型对提取的特征进行分类,识别出具体的人员行为。行为理解:对识别出的行为进行进一步分析,理解其背后的意图或状态。在人员行为分析中,常用的公开数据集包括UCF101、HMDB51、ActivityNet等。

zhubeibei168的博客 1344

看阿里技术官谈:为什么说Java程序员到了不得不掌握HTTP的地步?

上面我们对计算机网络的五层体系结构有了初步的了解,下面附送一张七层体系结构图总结一下。

知识分享官 195

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

漫画:程序员无休止加班,真实!

击上方“终端研发部”,选择“星标”回复“资源”,领取全网最火的Java核心知识总结~公众号后台回复“学习”,获取作者独家秘制精品资料往期文章1个牛逼的后台开源项目,接私活赚钱必备!2万...

这个时代,作为程序员可能要学习小程序 628

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

modbus tcp主站和从站_图文讲解PLC通讯MODBUS协议的应用及编程

点击箭头处“工业之家”,选择“关注公众号”!PLC通讯MODBUS协议的应用及编程现为大家讲解一下MODBUS的应用,现在工业控制上位机和下位机通信大部分采用通信协议为MODBUS,可想而知机器与机器通信的重要性。一:MODBUS系统框架图二:MODBUS运用MODBUS 通讯的底层为 RS485 信号采用双绞线进行联接就可以了,因 此传输距离较远,可达 1000 米,抗干扰性能比较好...

weixin_39912566的博客 6427

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

程序员有了孩子,老大叫玲玲,老二叫玲依,老三叫...

1老大叫玲玲老二叫玲依老三叫依玲老四叫依依老五叫忆初2我每天都在修昨天的BUG所以你是一个斐波那契程序员有道理!3B哥,你想听一个TCP的笑话吗?嗯呢,我想听一个TCP的...

python爬虫人工智能大数据 323

Java一个数组查找一个数位置,JS查找数组中出现的位置及个数

查找某个值在数组中出现的位置var attr = [1,4,5,3,2,7,6,9];var zhao = 8;var sy = -1;for(var i=0;i{if(attr[i]==zhao){sy = i;}}if(sy==-1){alert("没有找到值");}else{alert("该元素在"+sy);}几个变量在数组中出现的次数var attr = [1,4,3,5,9,9,3,2,...

weixin_42513365的博客 1151

方圆的2022年度书单,不只技术

今年读的闲书仍然比较杂,没有开始专题阅读,怪就怪在手头屯书太多,暂时消化不掉。技术书以电子书为主,实体书只在居家办公的时候抽时间读了几本。

方圆 Blog 315

三菱modbusRTU通讯实例_三菱FX5U以太网通讯功能有哪些?

点击箭头处“工业之家”,选择“关注公众号”!三菱FX5U以太网通讯功能如果不知道FX 5U以太网通讯基础知识就去学习实例,那难免画蛇添足,自寻烦恼。今天咱们就来说说FX 5U以太网基础知识中的功能部分。FX 5U以太网功能简介1、与工程工具“GX-Works3”、GOT(HMI)的连接使用集线器(交换机、路由器),可以连接CPU模块与多个工程工具、GOT。1个CPU模块最多可以同时连接8...

weixin_39558221的博客 3563

五次面试,程序员的悲催轮回

前言:本文是《四次面试,程序员越来越悲催了》的修改版,第五次面试,会是怎么样呢?01静态网页时代张大胖V1.0 毕业了, 去一家公司面试。“会做网站吗?”“会,我会用Dreamweave...

码农翻身 2795

硬核!

大家好,我是乔哥!经常有人问我,你是怎么学习的,为什么会这么多东西?其实没什么技巧,就是不断地找硬核知识,反复地学习和练习,使其成为自己的核心技能,从而超越周围的绝大多数人。为此,我每天上...

WantFlyDaCheng的博客 353

一天快速入门 Python

只看书不会进步,思考和实践才有成长,自学编程是一个比较枯燥的过程,如果没有正向反馈,学习的积极性很容易被打压下来,所以你应该积极参与到相关的技术圈子中去,尝试去解答力所能及的新手问题,向圈子中的大牛们寻求帮助,善于总结自己所学到的东西,分享给更多的人,记住,你不是一个人在战斗。

2201_75571291的博客 647
上一篇: Java后端学习,推荐书籍和学习路线
下一篇: 5G到来,App的未来,是JavaScript,Flutter还是Native ?
你说神码
博客等级 码龄9年 41粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值