【TCPIP】TCP详解笔记
⽬录
前⾔
本笔记记录 TCP/IP 中的 TCP 理论。包括三次握⼿、四次挥⼿、状态变迁、慢启动、快重传等等。
《TCP/IP详解》⼀共三卷,其中卷⼆、卷三更多偏重于编程细节,⽽卷⼀更多偏重于基础原理。
后⾯再发布个⽀持处理多线程并发及客户端数量限制的TCP服务端+TCP客户端例程。
17. TCP 传输控制协议
17.1 引⾔
17.2 TCP 服务
TCP提供⼀种⾯向连接的、可靠的字节流服务。
TCP通过下列⽅式来提供可靠性:
应⽤数据被分割成TCP认为最适合发送的数据块。由 TCP传递给IP的信息单位称为报⽂段或段(segment)。
当TCP发出⼀个段后,它启动⼀个定时器,等待⽬的端确认收到这个报⽂段。如果不能及时收到⼀个确认,将重发这个报⽂段。
当TCP收到发⾃TCP连接另⼀端的数据,它将发送⼀个确认。这个确认不是⽴即发送,通常将推迟⼏分之⼀秒。
TCP将保持它⾸部和数据的检验和。这是⼀个端到端的检验和,⽬的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错, TCP将丢弃这个报⽂段和不确认收到此报⽂段(希望发端超时并重发)。
TCP报⽂段作为 IP 数据报来传输,⽽IP数据报的到达可能会失序,因此TCP报⽂段
的到达也可能会失序。如果必要,TCP将对收到的数据进⾏重新排序,将收到的数据以
正确的顺序交给应⽤层。
IP数据报会发⽣重复,TCP的接收端必须丢弃重复的数据。
TCP还能提供流量控制。TCP连接的每⼀⽅都有固定⼤⼩的缓冲空间。 TCP的接收端只允许另⼀端发送接收端缓冲区所能接纳的数据。(窗⼝)
字节流服务(byte stream service):
两个应⽤程序通过TCP连接交换8 bit字节构成的字节流。TCP不在字节流中插⼊记录标识符。
17.3 TCP的⾸部
视图:
端⼝:每个TCP段都包含源端和⽬的端的端⼝号,⽤于寻发端和收端应⽤进程。这两个值加上IP⾸部中的源端IP地址和⽬的端IP地址唯⼀确定⼀个TCP连接。
socket:包含客户 IP 地址、客户端⼝号、服务器 IP 地址和服务器端⼝号的四元组。
序号:⽤于对字节流进⾏编号。
例如序号为 301,表⽰第⼀个字节的编号为 301,如果携带的数据长度为 100 字节,那么下⼀个报⽂段的序号应为 401。
确认号:期望收到的下⼀个报⽂段的序号。
例如 B 正确收到 A 发送来的⼀个报⽂段,序号为 501,携带的数据长度为 200 字节,因此 B 期望下⼀个报⽂段的序号为 701,B 发送给 A的确认报⽂段中确认号就为
701。
数据偏移:指的是数据部分距离报⽂段起始处的偏移量,实际上指的是⾸部的长度。
URG:紧急(The urgent pointer) 标志置位。只有当 URG 标志置1时紧急指针才有效。
ACK:确认标志。当 ACK=1 时确认号字段有效,否则⽆效。
TCP 规定,在连接建⽴后所有传送的报⽂段都必须把 ACK 置 1。
PSH:推标志。该标志置位时,接收端不将该数据进⾏队列处理,⽽是尽可能快将数据转由应⽤处理。
在处理 telnet 或 rlogin 等交互模式的连接时,该标志总是置位的。
RST:复位标志。复位标志有效,重建连接。
SYN:同步标志。同步序列编号(Synchronize Sequence Numbers)栏有效。
在连接建⽴时⽤来同步序号。当 SYN=1,ACK=0 时表⽰这是⼀个连接请求报⽂段。若对⽅同意建⽴连接,则响应报⽂中 SYN=1,ACK=1。
FIN:结束标志。⽤来释放⼀个连接,当 FIN=1 时,表⽰此报⽂段的发送⽅的数据已发送完毕,并要求释放运输连接。
窗⼝:窗⼝值作为接收⽅让发送⽅设置其发送窗⼝的依据。流量控制。
校验和:检验和覆盖了整个的TCP报⽂段:TCP⾸部和TCP数据。这是⼀个强制性的字段,⼀定是由发端计算和存储,并由收端进⾏验证。
紧急指针:紧急指针是⼀个正的偏移量,和序号字段中的值相加表⽰紧急数据最后⼀个字节的序号。
TCP的紧急⽅式是发送端向另⼀端发送紧急数据的⼀种⽅式。
只有当 URG 标志置1时紧急指针才有效。
选项:长度可变,最长可达40字节。当没有使⽤“选项”时,TCP的⾸部长度是20字节。最后的填充字段仅仅是为了使整个TCP⾸部长度是4字节的整数倍。
18. TCP连接的建⽴与终⽌
18.1 引⾔
18.2 连接的建⽴与终⽌
18.2.1 建⽴连接
三次握⼿建⽴连接
参考图:
建⽴连接的过程是由客户端发起,服务端等待客户请求
第⼀步:客户端向服务器端发送⼀个SYN报⽂段(只有⾸部,且SYN被置 1),初始序号(ISN)随机选择,假设为num_a,ACK 置 0。(客户端进⼊SYN_SEND状态)
第⼆步:服务器端收到 SYN报⽂段,便知道客户端需要请求握⼿,从 SYN报⽂段中提取对应的信息,为该 TCP 连接分配 TCP 缓存和变量,并向该客户 TCP 发送允许连接的报⽂段(握⼿应答报⽂)。这个报⽂段只有⾸部,包含3个重要的信息:(建⽴客户端-->服务端的连接)(服务器进⼊SYN_RECV状态)
SYN与ACK标志位1
将TCP报⽂段⾸部的确认序号字段设置为 num_a+1(这个num_a(ISN)是从握⼿请求报⽂中得到)。
服务器随机选择⾃⼰的初始序号(ISN,注意此ISN是服务器端的ISN,假设为num_b),并将其放置到TCP报⽂段⾸部的序号字段中。
第三步:客户端接收到服务器端的握⼿应答后,会将 SYN 置 0,ACK 置 1,确认序号置为 num_b+1, 设置窗⼝值,可以添加数据域的报⽂段发给服务器端。同时给该TCP连接分配缓存和变量。(建⽴服务端-->客户端的连接)(客户端和服务器端都进⼊ESTABLISHED状态)
18.2.2 终⽌连接
参考图
第⼀步:主机A发出 FIN报⽂段(⾸部FIN被置 1),序号假设为 num_c,ACK 被置 1,但是确认序号是⽆效的。(主机A进⼊FIN_WAIT_1状态)(主机B进⼊CLOSE_WAIT状态)第⼆步:当主机B收到 FIN报⽂段,它返回⼀个 ACK报⽂段(终⽌连接应答),确认序号为 num_c+1。此时断开客户端-->服务器端的⽅向。(主机A进⼊FIN_WAIT_2状态)第三步:主机B发出 FIN报⽂段向主机A请求终⽌连接,此时
序号为 num_d,ACK 被置 1,但是确认序号是⽆效的。(主机B进⼊LAST_ACK状态)
第四步:当主机A收到FIN报⽂段,它返回⼀个ACK报⽂段(终⽌连接应答),确认序号为 num_d+1。此时断开服务器端-->客户端的连接。(主机A进⼊TIME_WAIT状态)(主机B进⼊CLOSE状态)
18.2.3 TCP 连接状态变迁图
视图:
18.3 连接建⽴超时
18.4 最⼤报⽂段长度
最⼤报⽂段长度(MSS)表⽰TCP传往另⼀端的最⼤块数据的长度。当⼀个连接建⽴时,连接的双⽅都要通告各⾃的 MSS。
我们已经见过MSS都是1024。这导致 IP 数据报通常是4 0字节长:2 0字节的TCP⾸部和2 0字节的 IP ⾸部。
使⽤IEEE 802.3的封装,它的MSS可达 1452 字节。
18.5 TCP 半关闭
TCP 是全双⼯的。主要断开⼀线的连接,剩下⼀线还可以正常⼯作。如A只能发,B只能收。
为了使⽤这个特性,编程接⼝必须为应⽤程序提供⼀种⽅式来说明:
我已经完成了数据传送,因此发送⼀个⽂件结束(FIN)给另⼀端,但我还想接收另⼀端发来的数据,直到它给我发来⽂件结束(FIN)。
18.6 TCP 状态变迁图
视图:
18.6.1 2MSL 等待状态
MSL:报⽂段最⼤⽣存时间,它是任何报⽂段被丢弃前在⽹络内的最长时间。
等待 2MSL 原因:
保证 TCP 协议的全双⼯连接能够可靠关闭。
如果 B 端没有收到 ACK ,触发超时重发 FIN报⽂段,A 端依然能处理重发 ACK。如果 A 端直接 CLOSE 状态,就不能保证 B 端收到 ACK。
保证这次连接的重复数据段从⽹络中消失。
保证下次连接收到的数据报⽂段都是来⾃新连接的⽬标端。
18.6.2 平静时间的概念
平静时间(quiet time):TCP在重启动后的 MSL 秒内不能建⽴任何连接。
防⽌重启前的报⽂段被认为新的报⽂。所以要保证重启前的报⽂在⽹络中消失才能重启。
18.6.3 FIN_WAIT_2 状态
在挥⼿断开连接过程中,如果 B端(第三次挥⼿)不发出 FIN报⽂段 将会导致 A端 ⼀直处于 FIN_WAIT_2 状态。⽽ B端 ⼀直处于 CLOSE_WAIT 状态。
直⾄应⽤层决定关闭进⾏关闭才能跳出该状态。
可以设⽴定时器维护这个状态,但是必须在代码中注明此做法是违背协议的规范。
18.7 复位报⽂段
TCP⾸部中的 RST⽐特 是⽤于“复位”的。
18.7.1 到不存在的端⼝的连接请求
产⽣复位的⼀种常见情况是当连接请求到达时,⽬的端⼝没有进程正在听。
对于 UDP,当⼀个数据报到达⽬的端⼝时,该端⼝没在使⽤,它将产⽣⼀个ICMP端⼝不可达的信息。
⽽TCP则使⽤复位。
18.7.2 异常终⽌⼀个连接
正常的终⽌连接请求是发送 FIN报⽂段。
但是直接发送 RST复位报⽂段 也可以终⽌连接。称为 异常终⽌。
异常终⽌⼀个连接对应⽤程序来说有两个优点:
丢弃任何待发数据并⽴即发送复位报⽂段;
RST的接收⽅会区分另⼀端执⾏的是异常关闭还是正常关闭。
18.7.3 检测半边打开连接
半打开(Half-Open):⼀⽅已经关闭或异常终⽌连接⽽另⼀⽅却还不知道的TCP连接。
当异常的⼀⽅回复正常且继续收到来⾃另⼀⽅的数据(另⼀⽅并不知道这边的情况),这时接收⽅⽆法辨认接受的数据是什么,于是发送 RST复位报⽂段 作为应答。
tip:另⼀种检测⽅法:
可以采⽤ keepalive 功能。(在23章-TCP的保活定时器中说明)
同时打开(simultaneous open):每⼀⽅必须发送⼀个SYN,且这些SYN必须传递给对⽅。
TCP是特意设计为了可以处理同时打开,对于同时打开它仅建⽴⼀条连接⽽不是两条连接。
(其他的协议族,最突出的是OSI运输层,在这种情况下将建⽴两条连接⽽不是⼀条连接)
两端⼏乎在同时发送 SYN,并进⼊SYN_SENT状态。当每⼀端收到SYN时,状态变为SYN_RCVD,同时它们都再发SYN并对收到的SYN进⾏确认。当双⽅都收到SYN及相应的ACK时,状态都变迁为ES
TABLISHED。
18.9 同时关闭
18.10 TCP 选项
当前 TCP 选项格式:
每个选项的开始是1字节k i n d字段,说明选项的类型。
18.11 TCP 服务器的设计
⼤多数的TCP服务器进程是并发的。当⼀个新的连接请求到达服务器时,⼀般会⽤⼀个新的进程或线程处理新客户请求。(不同的操作系统有不同的处理⽅案)
TCP服务器忙时处理连接请求规则:
服务端维护⼀个固定长度的连接队列。该队列维护着已经三次握⼿完成,但是还没有被应⽤层接受的连接。
注意:区分TCP接受⼀个连接是将其放⼊这个队列,⽽应⽤层接受连接是将其从该队列中移出。
应⽤层将指明该队列的最⼤长度,这个值通常称为积压值 ( backlog)。
当⼀个连接请求(即SYN)到达时,TCP使⽤⼀个算法,根据当前连接队列中的连接数来确定是否接收这个连接。
如果对于新的连接请求,该 TCP 监听的端点的连接队列中还有空间,TCP 模块将对SYN进⾏确认并完成连接的建⽴。但应⽤层只有在三次握⼿中的第三个报⽂段收到后才会知道这个新连接时。另外,当客户进程的主动打开成功但服务器的应⽤层还不知道这个新的连接时,它可能会认为服务器进程已经准备好接收数据了(如果发⽣这种情况,服务器的TCP仅将接收的数据放⼊缓冲队列)。
如果对于新的连接请求,连接队列中已没有空间,TCP将不理会收到的SYN。也不发回任何报⽂段(即不发回RST)。如果应⽤层不能及时接受已被 TCP 接受的连接,这些连接可能占满整个连接队列,客户的主动打开最终将超时。
19. TCP 的交互数据流
19.1 引⾔
建⽴在TCP协议上的应⽤层协议有⾮常多,如FTP、HTTP、Telnet、Rlogin等。这些协议依据数据传输的多少能够分为两类:
交互数据类型:如 Telnet,这类协议⼀般仅仅做⼩流量的数据交换,⽐⽅每按下⼀个键,要回显⼀些字符。
成块数据类型:如 FTP,这类协议须要传输的数据⽐较多,⼀般传输的数据量⽐较⼤。
19.2 交互式输⼊
视图:
⼀个回显键⼊会产⽣4个报⽂段:(也可以把②和③合并)tcpip协议pdf
客户发出的按键数据报⽂段。
服务器发出的按键确认报⽂段。
服务器发出的回显数据报⽂段。
客户发出的回显确认报⽂段。
19.3 经受时延的确认
通常 TCP 在接收到数据时并不⽴即发送 ACK;它推迟发送,以便将 ACK 与需要沿该⽅向发送的数据⼀起发送(有时称这种现象为数据捎带 ACK)。
绝⼤多数实现采⽤的时延为200 ms,也就是说,TCP 将以最⼤ 200 ms的时延等待是否有数据⼀起发送。
19.4Nagle 算法
在上⾯描述的 Rlogin 回显中,⼀个字符就回显⼀次,其中产⽣的分组为 41字节的分组:20字节IP⾸部 + 20字节TCP⾸部 + 1字节的数据。
若把这些⼩分组放到⼴域⽹上,会增加拥塞。
Nagle 算法就是解决上⾯的情况。
Nagle:
该算法要求⼀个 TCP 连接上最多只能有⼀个未被确认的未完成的⼩分组。在该分组的确认到达之前不能发送其他的⼩分组。
TCP 收集这些少量的分组,并在确认到来时以⼀个分组的⽅式发出去。
Nagle 优点是⾃适应:确认到达得越快,数据也就发送得越快。
19.4.1 关闭 Nagle 算法
插⼝API⽤户可以使⽤ TCP_NODELAY 选项来关闭Nagle算法。
19.5 窗⼝⼤⼩通告
20. TCP的成块数据流
20.1 引⾔
主要涉及:
滑动窗⼝-流量控制
慢启动
20.2 正常数据流
20.3 滑动窗⼝
利⽤滑动窗⼝实现流量控制。
视图:
窗⼝两个边沿的相对运动增加或减少了窗⼝的⼤⼩。
称窗⼝左边沿向右边沿靠近为窗⼝合拢。这种现象发⽣在数据被发送和确认时。
当窗⼝右边沿向右移动时将允许发送更多的数据,我们称之为窗⼝张开。这种现象发⽣在另⼀端的接收进程读取已经确认的数据并释放了 TCP 的接收缓存时。
当右边沿向左移动时,我们称之为窗⼝收缩。
注意,窗⼝只是说明接收⽅当前能接收的最⼤容量⽽已,发送⽅不必⼀次性发满整个窗⼝⼤⼩。
20.4 窗⼝⼤⼩
由接收⽅提供的窗⼝的⼤⼩通常可以由接收进程控制,这将影响 TCP 的性能。
插⼝API允许进程设置发送和接收缓存的⼤⼩。
接收缓存的⼤⼩是该连接上所能够通告的最⼤窗⼝⼤⼩。
应⽤程序可以通过修改插⼝缓存⼤⼩来增加性能。
20.5 PUSH 标志
发送⽅使⽤ PUSH标志 通知接收⽅将所收到的数据全部提交给接收进程。
这⾥的数据包括与 PUSH ⼀起传送的数据以及接收⽅ TCP 已经为接收进程收到的其他数据。
20.6 慢启动
慢开始算法处理属于 TCP拥塞控制。
当主机开始发送数据时,如果⽴即所⼤量数据字节注⼊到⽹络,那么就有可能引起⽹络拥塞,因为现在并不清楚⽹络的负荷情况。所以,较好的⽅法是 先探测⼀下,即由⼩到⼤逐渐增⼤发送窗⼝。
慢开始和拥塞避免:
发送⽅维持⼀个拥塞窗⼝ cwnd ( congestion window )的状态变量。
拥塞窗⼝的⼤⼩取决于⽹络的拥塞程度,并且动态地在变化。
发送⽅让⾃⼰的发送窗⼝等于拥塞窗⼝。
发送⽅控制拥塞窗⼝的原则是:
只要⽹络没有出现拥塞,拥塞窗⼝就再增⼤⼀些,以便把更多的分组发送出去。
但只要⽹络出现拥塞,拥塞窗⼝就减⼩⼀些,以减少注⼊到⽹络中的分组数。
慢开始算法:
通常在刚刚开始发送报⽂段时,先把拥塞窗⼝ cwnd 设置为⼀个最⼤报⽂段MSS的数值。
在每收到⼀个对新的报⽂段的确认后,把拥塞窗⼝增加⾄多⼀个MSS的数值。
⽤这样的⽅法逐步增⼤发送⽅的拥塞窗⼝ cwnd ,可以使分组注⼊到⽹络的速率更加合理。
为了防⽌拥塞窗⼝cwnd增长过⼤引起⽹络拥塞,还需要设置⼀个慢开始门限 ssthresh 状态变量。
当 cwnd < ssthresh 时,使⽤上述的慢开始算法。
当 cwnd = ssthresh 时,既可使⽤慢开始算法,也可使⽤拥塞控制避免算法。
当 cwnd > ssthresh 时,停⽌使⽤慢开始算法⽽改⽤拥塞避免算法。
拥塞避免:
让拥塞窗⼝cwnd缓慢地增⼤,即每经过⼀个往返时间RTT就把发送⽅的拥塞窗⼝cwnd加1,⽽不是加倍。
注意:
符合以下条件之⼀即可使⽤拥塞避免,不⼀定要达到 ssthresh 值。
当 cwnd > ssthresh 时。
发送⽅判断⽹络出现拥塞(其根据就是没有收到确认)。
20.7 成块数据的吞吐量
20.7.1 带宽时延乘积
带宽时延乘积:capacity(bit) = bandwidth (b/s) × round-trip time ( s )。
这个值依赖于⽹络速度和两端的 RTT。
20.7.2 拥塞
部分拥塞情景:
当数据到达⼀个⼤的管道(如⼀个快速局域⽹)并向⼀个较⼩的管道(如⼀个较慢的⼴域⽹)发送时便会发⽣拥塞。
当多个输⼊流到达⼀个路由器,⽽路由器的输出流⼩于这些输⼊流的总和时也会发⽣拥塞。
20.8 紧急⽅式
TCP提供了 紧急⽅式 ( u rgent mode),它使⼀端可以告诉另⼀端有些具有某种⽅式的 紧急数据 已经放置在普通的数据流中。
另⼀端被通知这个紧急数据已被放置在普通数据流中,由接收⽅决定如何处理。
URG⽐特 被置 1,并且⼀个 16bit 的紧急指针 被置为⼀个正的偏移量,该偏移量必须与 TCP ⾸部中的序号字段相加,以便得出紧急数据的最后⼀个字节的序号。
紧急⽅式的作⽤:
两个最常见的例⼦是 Telnet 和 Rlogin。当交互⽤户键⼊中断键时。(参考卷⼀26 章)
另⼀个例⼦是 FTP,当交互⽤户放弃⼀个⽂件的传输时。(参考卷⼀27 章)
21. TCP的超时与重传
21.1 引⾔
对每个连接,TCP管理4个不同的定时器:
重传定时器使⽤于当希望收到另⼀端的确认。功能如拥塞避免。
坚持( persist )定时器使窗⼝⼤⼩信息保持不断流动,即使另⼀端关闭了其接收窗⼝。
保活( keepalive )定时器可检测到⼀个空闲连接的另⼀端何时崩溃或重启。
2MSL定时器测量⼀个连接处于TIME_WAIT状态的时间。
21.2 超时与重传的简单例⼦
21.3 往返时间测量
TCP 超时与重传中最重要的部分就是对⼀个给定连接的往返时间(RTT)的测量。
由于路由器和⽹络流量均会变化,因此我们认为这个时间可能经常会发⽣变化,TCP 应该跟踪这些变化并相应地改变其超时时间。
⾸先 TCP 必须测量在发送⼀个带有特别序号的字节和接收到包含该字节的确认之间的 RTT。
⽤ M 表⽰所测量到的 RTT。
计算:new_RTTS = (1-α)x(old_RTTS) + αx(new_RTT)
α:值推荐为 1/8 的平滑因⼦。
new_RTTS:新的平滑往返时间。
old_RTTS:旧的平滑往返时间。
new_RTT:测量到的 RTT。
每个新估计的90%来⾃前⼀个估计,⽽10%则取⾃新的测量。
计算:RTO = RTTS+4x(RTTD)
RTO:重传超时时间。
RTTD:是RTT的偏差加权的平均值,与 RTTS 和新得到的 RTT 样本之差有关。
第⼀次测量到 RTT 样本时,RTTS 的取值就为测量的 RTT 样本值。
计算:new_RTTD = (1-β)x(lod_RTTD) + βx(new_RTT)
β:推荐值为 1/4。
第⼀次测量 RTTD 时,RTTD 的取值为 RTT 样本值的⼀半。
如上所述就是测量 RTO 公式和参数。
但是仍然有⼀个问题需要确定,在计算加权平均 RTTS 时,只要数据包重传没有使⽤往返时间,就可以得出 RTTS 和 RTO 是准确的。
当之后出现超重时,新 RTO 是 old_RTO 的2倍。
21.4 往返时间RTT的例⼦
21.5 拥塞举例
21.6 拥塞避免算法
拥塞避免算法是⼀种处理丢失分组的⽅法。
拥塞避免算法和慢启动算法需要对每个连接维持两个变量:⼀个拥塞窗⼝ cwnd 和⼀个慢 启动门限 ssthresh。
符合以下条件之⼀即可使⽤ 拥塞避免 ,不⼀定要达到 ssthresh 值。
当 cwnd > ssthresh 时。
发送⽅判断⽹络出现拥塞(其根据就是没有收到确认)。
21.7 快速重传与快速恢复算法
快重传:
快重传算法:
⾸先要求接收⽅每收到⼀个失序的报⽂段后就⽴即发出重复确认(为的是使发送⽅及早知道有报⽂段没有到达对⽅)⽽不要等到⾃⼰发送数据时才进⾏捎带确认。
快重传算法还规定,发送⽅只要⼀连收到三个重复确认就应当⽴即重传对⽅尚未收到的报⽂段,⽽不
必继续等待M3设置的重传计时器到期。
快恢复:
快恢复有两个要点:
当发送⽅连续收到三个重复确认,就执⾏乘法减⼩算法,把慢开始门限 ssthresh 减半。
把 cwnd 值设置为慢开始门限 ssthresh 减半后的数值,然后开始执⾏拥塞避免算法(加法增⼤),使拥塞窗⼝缓慢地线性增⼤。(⽽不是重新执⾏慢开始算法)21.8 拥塞举例(续)
21.9 按每条路由进⾏度量
如今较新的TCP实现的路由表项中维持了很多指标,当⼀个TCP连接关闭时,假设已经发出了⾜够多的数据来获得有意义的统计资料。
且⽬的节点的路由表项不是⼀个默认表项。
那么下列信息就保存在在路由表项中以备下次使⽤:
被平滑的RTT
被平滑的均值偏差
慢启动门限
⾜够多的数据:是指 16 个窗⼝的数据。
21.10 ICMP的差错
TCP 能够遇到的最常见的 ICMP 差错就是:
源站抑制
主机不可达
⽹络不可达

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。