TCP协议回顾

本文详细解读TCP协议中的三次握手和四次挥手机制,解释为何需要三次握手而非一次、两次或四次,以及四次挥手的过程。深入探讨发送窗口、接收窗口和拥塞窗口的概念,阐述它们在TCP协议中的作用。并通过实例说明TCP的窗口总结及拥塞控制机制。

最近的经历发现TCP协议是个很好玩的东西,之前学的时候没什么感受,现在重新好好温习一次。
*注:传输层一般都是以sender(发送方)和receiver(接收方)来讨论,而不是客户端和服务器,因为任何联网的机器都可以作为sender或receiver。

A. 三次握手

三次握手的过程如下图所示,注意各个字段的值及其变化,如SYN(synchronize的缩写,同步),还有seq字段(sender和server都有各自的seq,至于为什么呢?在最后一部分中会说到)。
三次握手

不过重点是——为什么要三次握手,而不是一次、两次、四次握手?
其实我也不知道,google了一下,发现有很好的答案,现在分享下:
参考:【博客1】【博客2】
1)首先考虑一个场景,sender发送了一个请求打开TCP链接的包(A),中间延迟了一下,sender这边经过了timeout-interval,所以sender重新发了一个请求包(B),后来A也到达了receiver那边,那么receiver会作出什么反应呢?

  • 直接为每个请求包都打开一个TCP链接吗?
  • 很明显这样会浪费资源,因为包A是无效的了,sender那边已经认为它是丢失的包了,也不会通过它请求到的链接来传输数据。
  • 那该怎么办呢?receiver无法确定这个包是否有效。
  • receiver再发一个包回去询问呗,如果sender那边有相应的回应,那么就表示该包是一个有效的包。
  • 好,sender那边收到receiver发来的(对于A的)确认包,比较一下seq的值,发现不一样(因为这个值是sender随机出来的,所以前后两次相同的概率很小很小很小,一般可以认为是不一样的),好,那就不管它。
  • receiver那边呢?时间过了这么久了,还没收到sender的回应,所以它也可以认为刚才那个包(A)是无效的,好,风波告一段落!

综上所述,至少需要3次握手就可以避免这种情况的发生。至于为什么不能是4次,5次,6次,应该是(我觉得,这样能够基本保证就OK了,再多几次,延迟就太大了,得不偿失,trade-off的平衡过程?)。

2)摘录博客1的:这个问题的本质是,信道不可靠,但是通信双方需要就某个问题达成一致。而要解决这个问题,无论你在消息中包含什么信息,三次通信是理论上的最小值。所以三次握手不是TCP本身的要求,而是为了满足“在不可靠信道上可靠地传输信息”这一需求所导致的。

这个是从信息论的角度来回答的,大概知道是信息熵的意思,但我还不清楚其中的计算细节如何,等我这学期学完信息论再来补(小板凳在此)!!!

B. 四次挥手

过程如下图所示,同样注意FIN字段(Finish的缩写),还有其中等了一段时间(timed wait),这又是为什么呢?
四次挥手
由于TCP是全双工的(即双方可以互发数据),无论是客户端还是服务器端,都可以主动关闭正在通信中的链接,所以以下称主动关闭TCP链接的一方为“主动方”,另一方为“被动方”。
为什么不在“第二次挥手”时,被动方同时将ACK和FIN发送给主动方呢?要分两次这么麻烦?
注意刚刚说过,TCP的双方是可以互发数据的,你这边没数据发了(或者其它原因),想中断链接,但是那边可能还会有数据要发过来,TCP作为一个绅士优雅的协议,当然不能粗暴地不商量好就单方面断开啦,所以先等被动方发送ACK过来(如果timeout了,就继续发FIN,直到对方有回应),然后再等对方也发送完了,决定关闭链接了(第三次挥手,被动方发送FIN包),主动方这边再发一个ACK包确认已经收到被动方的FIN包。
咦,为什么主动方发送完ACK包之后还有一段Timed wait的时间!!!!(一般为2MSL,MSL表示段在网络中的最长生存时间,RFC中推荐规定为2分钟)原因可能很多,一个常说到的原因是——注意每次发包都是有time-out机制的,在最后这段Timed wait时间内,主动方会不断发包(超时才会重发)给被动方,如果被动方正确关闭了,那么将不会有任何回应;但是如果被动方没有正确关闭,就会发送回复的包。综上所述,这段时间是用来检查被动方有没有正确关闭的(悄悄问一句,如果发现没有正确关闭,那么主动方这边会怎么做呢?哈哈,可能得去看RFC文档才会知道了,教科书只会介绍最主要的原理,太细的细节得看专业的文档)

C. 发送方的窗口

“窗口”是TCP中一个很重要的概念,包括(发送方的)发送窗口,(接收方的)接收窗口,(发送方的)拥塞窗口,它们各有各的作用,现在先介绍发送窗口
首先注意到,目前为止谈论到的发送包,都是一个包发过去,等待对方发一个包回来,然后这边再发一个过去……毫无疑问这样的效率是很低的,如下图所示。
stop-and-wait
那么怎么提高发送的速度呢?注意到这有点像流水线(Pipeline,如果没学过计算机组成原理,也无所谓,理解成工厂里生产物品的过程就好了),发送方、传输媒介(整个网络)、接收方,三方的工作是独立开来的,前者的输出作为后者的输入,不明觉厉的可以看下下面这段比喻:

想象工厂制作一瓶饮料的时候,A车间先生产一个瓶子出来,送到B车间,B往里面装饮料,完了送到C车间加盖包装。那么在B装饮料的同时,A那边可以再生产一个瓶子出来,在B将瓶子送到C的时候,A马上就有一个瓶子送到B,是不是很快?当然这是假设三个工作的时间相同啦

用了流水线就有了下面的图了:
pipeline

其实有了流水线,就会出现较多的问题了,比如:发送方那边怎么接收?如果中间某个包丢掉了,而接收到了后面的包,这些“先到”的包是要丢弃掉吗?有不同的处理机制——Go-Back-N就是直接丢掉,所以它在接收方那边不需要缓冲区;Selective Repeat则是用一个缓冲区来缓存收到的包,即使是“先到”的包也会被接收。两者的效率可以比较直观就看出来~

说到这里,“发送窗口”到底是怎么回事呢?把要发送的数据看成一个包的数组,“发送窗口”就是一个在这个数组上的有限的连续的范围,比如[10, 10+6],其中10叫做窗口的base,6叫做窗口的大小。有什么用呢?它控制着流水线发送的包的数量,如果太少了,效率不高;如果太多了,一方面可能接收方那边受不了,丢包多,浪费流量,另一方面很容易造成网络拥塞。

至于这个窗口的大小是如何调节的,书里几乎没有谈及到,有兴趣的可以看一下相关的RFC文档(其实结合即将谈到的接收窗口和拥塞窗口,自己yy一个算法也是可以的)。

D. 接收窗口

C中也说到了,实行pipeline发送后,接收方如果使用相对比较高效的Selective Repeat策略的话,就需要一个缓冲区了,那么这个缓冲区也是有限的,如果太多包到达,它也接收不了,只能丢掉,但是这个信息得反馈回去给发送方啊,叫它慢点发,别浪费流量(2333,是不是跟日常人们的对话很像?)

那么怎么将“自己还能接收多少数据”的信息反馈回去呢?注意TCP段的数据结构,如下图所示,注意到首部是有一个叫做“Receive window”的字段,16 bit,它就是用来做这件事的,把自己的缓冲区还能装下多少数据放在这个字段,以发过去通知发送方。
TCP Segment

具体这个字段的值,就叫做接收窗口(Receive window),它的计算方式为:

RcvWindow = RcvBufferSize - [LastByteRcvd - LastByteRead]

这些量顾名思义就行了,也很容易理解,不赘述了。
PS,这种通过RecvWindow来控制发送方的方式叫做Flow Control,流控制。

E. 拥塞窗口

这是用来调整发送速率以达到尽量避开网络拥塞的,那么是根据什么信息来调整呢?

首先,想一下,sender这边能够收到什么信息?ACK嘛,没有ACK就有time-out的消息。进一步来看,time-out表示很有可能是网络太堵塞,然后丢包了。而ACK的表现呢?注意现在是实行了Pipeline的发送方式,它的ACK会是怎么样的呢?
fast-retransmit
如上图所示,如果是收到了同一个seq的三个ACK,也就是——中间某个包丢了,但后续的包到达了。这说明网络其实不是很拥堵的,很可能只是某个路由器偶尔的抽风而已(不然后续的包也到达不了对面)。所以,需要快速重传(等到time-out就太慢啦,提高速度!)

总结一下:
1. 如果收到Tri-ACK,就快速重传;
2. 如果没有收到三个ACK,并且time-out了,表示网络很堵塞,需要做出一些措施来避开这个堵塞(因为如果继续发送,会导致网络负担更重,甚至于崩溃)。

F. TCP的窗口的总结

其实CDE三部分介绍的三种窗口,分别对应的是发送方、接收方、传输媒介,这样来看的话,TCP的机制就很完整了,真心是个很巧妙的东西,不过看一下它的发展历史,也就不足为奇了,它是人们一边实践,一边修改才建立起来的机制,能不精巧吗?

G. TCP的拥塞控制机制

哈哈,激动人心的时刻到了,其实这部分不需要怎么说,直接看下面这个有限状态机就好了:
拥塞控制机制
注意三个状态,以及它们之间是怎么转化的。

首先是slow start,为什么要从很小的值(一般是1或2)开始呢?
这是因为TCP需要适应所有状况的网络,无论带宽有多大,所以它需要从小的值开始试探,而为了加快探测的时间,这个阶段的增长方式是“指数增长”!

然后是Congestion avoidance,这个就是探查到了接近当前这段网络能够承受的流量(根据预先设定好的阈值来判断),所以这个时候就不能继续翻倍地增加发送量了,线性增长就好了。

接着是Fast recovery,之所以会进入它,都是因为收到了三个ACK,表示需要快速重传。

最后需要说明的是time-out的时候会怎么办,无论在哪个状态发生time-out,都会直接进入slow-start!!!而这其中的阈值的变化、拥塞窗口的变化,具体数据看图就好了,下面是一个实例:
example

X. 更多

1)MSL(Maximum segment lifetime)、TTL(Time to live)以及RTT(Round trip time)的关系:http://wushank.blog.51cto.com/3489095/1135060
2)如果两边几乎同时发出FIN包,在收到对方的ACK之前,先收到了FIN,这是个有趣的情况,不过目前还不知道会发生什么事。
3)Wiki关于MSL的描述:https://en.wikipedia.org/wiki/Maximum_segment_lifetime
4)致谢:本文的图片均截图自《Computer Networking A Top-Down Approach》第六版,谢谢,如有侵权,请通过博客联系我删除。

内容概要:本文档是一份关于交换路由配置的学习笔记,系统地介绍了网络设备的远程管理、交换机与路由器的核心配置技术。内容涵盖Telnet、SSH、Console三种远程控制方式的配置方法;详细讲解了VLAN划分原理及Access、Trunk、Hybrid端口的工作机制,以及端口镜像、端口汇聚、端口隔离等交换技术;深入解析了STP、MSTP、RSTP生成树协议的作用与配置步骤;在路由部分,涵盖了IP地址配置、DHCP服务部署(接口池与全局池)、NAT转换(静态与动态)、静态路由、RIP与OSPF动态路由协议的配置,并介绍了策略路由和ACL访问控制列表的应用;最后简要说明了华为防火墙的安全区域划分与基本安全策略配置。; 适合人群:具备一定网络基础知识,从事网络工程、运维或相关技术岗位1-3年的技术人员,以及准备参加HCIA/CCNA等认证考试的学习者。; 使用场景及目标:①掌握企业网络中常见的交换与路由配置技能,提升实际操作能力;②理解VLAN、STP、OSPF、NAT、ACL等核心技术原理并能独立完成中小型网络搭建与调试;③通过命令示例熟悉华为设备CLI配置逻辑,为项目实施和故障排查提供参考。; 阅读建议:此笔记以实用配置为主,建议结合模拟器(如eNSP或Packet Tracer)动手实践每一条命令,对照拓扑理解数据流向,重点关注VLAN间通信、路由选择机制、安全策略控制等关键环节,并注意不同设备型号间的命令差异。
<think>好的,我现在需要处理用户的问题,他想了解Modbus TCP与标准TCP协议的区别和联系。首先,我应该回顾之前的对话历史,确保这次回答符合用户的需求,并且保持连贯性。用户之前询问了Modbus RTU和TCP的差异及使用场景,现在转向Modbus TCP与标准TCP的比较,这说明他对Modbus协议的不同实现及其底层网络协议的关系感兴趣。 首先,我需要明确Modbus TCP和标准TCP的关系。Modbus TCP是应用层协议,而标准TCP是传输层协议。Modbus TCP构建在TCP之上,利用TCP的可靠传输机制,但本身定义了特定的应用数据结构和功能码。这可能是一个关键点,需要在回答中突出。 接下来,用户可能需要了解两者的具体区别,比如协议层次、数据封装、端口使用、错误处理机制等。比如,标准TCP负责建立连接、确保数据可靠传输,而Modbus TCP在应用层定义如何打包数据,如MBAP头的结构,功能码等。此外,标准TCP使用端口号来区分应用,Modbus TCP默认使用502端口,这也是一个区别点。 另外,联系方面,Modbus TCP依赖TCP协议来管理数据传输的可靠性,比如错误检测、重传机制等。而Modbus TCP自身不需要像Modbus RTU那样添加CRC校验,因为它依赖TCP的校验机制。这一点在之前的回答中也提到过,需要保持一致性。 用户可能还需要实际应用的例子,比如在工业物联网中,Modbus TCP如何利用标准TCP进行远程监控,而标准TCP本身可以支持多种其他应用协议,如HTTP、FTP等。这可能帮助用户理解两者的不同应用场景。 需要确保回答结构清晰,分点说明区别和联系,可能使用小标题和项目符号。同时,要注意使用中文,遵循之前的格式要求,比如行内公式用$...$,独立公式用$$...$$,但在这个问题中可能涉及公式较少,需要根据内容判断是否添加。 还要生成相关问题,可能需要考虑用户可能的后续问题,比如如何配置Modbus TCP通信,或者Modbus TCP与其他工业协议的区别等。但根据用户当前问题,相关问题应集中在Modbus TCP与标准TCP的对比上,比如协议结构、应用场景、性能差异等。 最后,检查是否有引用之前的注释,但用户提到之前的引用是站内的,可能需要忽略或调整引用标注。根据用户指示,之前的引用仅供参考,现在需要尽可能参考上一次的问题和回答,所以需要确保信息连贯,不重复,但详细说明新的内容。</think>#### Modbus TCP与标准TCP协议的区别与联系 ##### 一、协议层级关系 1. **标准TCP**:属于**传输层协议**(OSI第4层),提供端到端的可靠数据传输服务,包括连接管理、流量控制、错误重传等功能[^1][^4]。 2. **Modbus TCP**:是**应用层协议**(OSI第7层),基于标准TCP实现,定义了工业设备间的数据读写规则(功能码、数据地址映射等)。其报文格式为: $$ \text{Modbus TCP报文} = \text{MBAP报头(7字节)} + \text{Modbus RTU数据帧(去除了CRC)} $$ 例如,读取线圈状态的请求报文:`00 01 00 00 00 06 01 01 00 00 00 08`[^2][^4]。 --- ##### 二、核心差异 | **对比维度** | **标准TCP** | **Modbus TCP** | |--------------------|---------------------------------------|-----------------------------------------| | **协议目标** | 通用数据传输(如网页、文件) | 专用工业设备控制(PLC、传感器) | | **数据封装** | 纯二进制流,无固定结构 | 强制包含MBAP报头+功能码+数据字段 | | **端口号** | 动态分配(HTTP=80, FTP=21等) | 固定使用502端口 | | **校验机制** | 依赖TCP校验(序列号、ACK确认) | 仅依赖TCP校验,无额外CRC | | **通信模式** | 支持全双工 | 基于主从问答模式(单次请求-响应) | --- ##### 三、协同工作机制 Modbus TCP **完全依赖标准TCP的底层传输能力**: 1. **连接建立**:通过TCP三次握手初始化通信链路。 2. **数据传输**:将Modbus应用数据(如读寄存器指令)封装为TCP负载。 3. **错误恢复**:由TCP协议自动处理丢包、乱序等问题,Modbus TCP仅需关注应用层逻辑。 ###### 示例代码(Python使用标准TCP发送Modbus TCP请求): ```python import socket # 标准TCP连接 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(("192.168.1.10", 502)) # Modbus TCP报文:读取保持寄存器(功能码0x03) request = bytes.fromhex("0001 0000 0006 01 03 0000 0001") client.send(request) response = client.recv(1024) print("响应数据:", response.hex()) # 示例响应:0001 0000 0005 01 03 02 00FF ``` --- ##### 四、典型应用场景 - **标准TCP**:网页浏览(HTTP)、文件传输(FTP)、电子邮件(SMTP)。 - **Modbus TCP**:工业自动化(PLC控制、SCADA系统)、智能楼宇(HVAC设备监控)、能源管理系统(电表数据采集)[^3][^4]。 --- ##### 五、选择建议 - **需用Modbus TCP的情况**:与工业设备交互(如西门子PLC、施耐德仪表)。 - **需用标准TCP的情况**:自定义私有协议开发或非Modbus设备通信。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值