专栏首页cwl_Java速读原著-TCP/IP(ICMP端口不可达差错)

速读原著-TCP/IP(ICMP端口不可达差错)

6.5 ICMP端口不可达差错

最后两小节我们来讨论 I C M P查询报文—地址掩码和时间戳查询及应答。现在来分析一种I C M P差错报文,即端口不可达报文,它是 I C M P目的不可到达报文中的一种,以此来看一看I C M P差错报文中所附加的信息。使用 U D P(见第11章)来查看它。

U D P的规则之一是,如果收到一份 U D P数据报而目的端口与某个正在使用的进程不相符,那么U D P返回一个I C M P不可达报文。可以用 T F T P来强制生成一个端口不可达报文( T F T P将在第1 5章描述)。

对于T F T P服务器来说, U D P的公共端口号是 6 9。但是大多数的 T F T P客户程序允许用c o n n e c t命令来指定一个不同的端口号。这里,我们就用它来指定 8 8 8 8端口:

c o n n e c t命令首先指定要连接的主机名及其端口号,接着用 g e t命令来取文件。敲入 g e t命令后,一份U D P数据报就发送到主机s v r 4上的8 8 8 8端口。t c p d u m p命令引起的报文交换结果如图6 - 8所示。

在U D P数据报送到s v r 4之前,要先发送一份A R P请求来确定它的硬件地址(第 1行)。接着返回A R P应答(第2行),然后才发送U D P数据报(第3行)(在t c p d u m p的输出中保留A R P请求和应答是为了提醒我们,这些报文交换可能在第一个 I P数据报从一个主机发送到另一个主机之前是必需的。在本书以后的章节中,如果这些报文与讨论的题目不相关,那么我们将省 略它们)。

一个I C M P端口不可达差错是立刻返回的(第 4行)。但是,T F T P客户程序看上去似乎忽略了这个I C M P报文,而在5秒钟之后又发送了另一份 U D P数据报(第5行)。在客户程序放弃之前重发了三次。

注意,I C M P报文是在主机之间交换的,而不用目的端口号,而每个 2 0字节的U D P数据报则是从一个特定端口(2 9 2 4)发送到另一个特定端口( 8 8 8 8)。

跟在每个U D P后面的数字2 0指的是U D P数据报中的数据长度。在这个例子中, 2 0字节包括T F T P的2个字节的操作代码, 9个字节以空字符结束的文件名 t e m p . f o o,以及9个字节以空字符结束的字符串n e t a s c i i(T F T P报文的详细格式参见图1 5 - 1)。

如果用- e选项运行同样的例子,我们可以看到每个返回的 I C M P端口不可达报文的完整长度。这里的长度为7 0字节,各字段分配如图6 - 9所示。

I C M P的一个规则是, I C M P差错报文(参见图 6 - 3的最后一列)必须包括生成该差错报文的数据报I P首部(包含任何选项),还必须至少包括跟在该 I P首部后面的前 8个字节。在我们的例子中,跟在I P首部后面的前8个字节包含U D P的首部(见图11 - 2)。

一个重要的事实是包含在 U D P首部中的内容是源端口号和目的端口号。就是由于目的端口号(8 8 8 8)才导致产生了 I C M P端口不可达的差错报文。接收 I C M P的系统可以根据源端口号(2 9 2 4)来把差错报文与某个特定的用户进程相关联(在本例中是 T F T P客户程序)。

导致差错的数据报中的 I P首部要被送回的原因是因为 I P首部中包含了协议字段,使得I C M P可以知道如何解释后面的 8个字节(在本例中是 U D P首部)。如果我们来查看 T C P首部(图1 7 - 2),可以发现源端口和目的端口被包含在 T C P首部的前8个字节中。

I C M P不可达报文的一般格式如图 6 - 1 0所示。

在图6 - 3中,我们注意到有1 6种不同类型的I C M P不可达报文,代码分别从0到1 5。I C M P端口不可达差错代码是3。另外,尽管图6 - 1 0指出了在I C M P报文中的第二个32 bit字必须为0,但是当代码为4时(“需要分片但设置了不分片比特”),路径M T U发现机制(2 . 9节)却允许路由器把外出接口的MTU填在这个32 bit字的低16 bit中。我们在11.6节中给出了一个这种差错的例子。

尽管I C M P规则允许系统返回多于8个字节的产生差错的I P数据报中的数据,但是大多数从伯克利派生出来的系统只返回 8个字节。 Solaris 2.2的i p _ i c m p _ r e t u r n _d a t a _ b y t e s选项默认条件下返回前6 4个字节(E . 4节)。t c p d u m p时间系列 在本书的后面章节中,我们还要以时间系列的格式给出t c p d u m p命令的输出,如图6 - 11所示。

时间随着向下而递增,在图左边的时间标记与 t c p d u m p命令的输出是相同的(见图 6 - 8)。位于图顶部的标记是通信双方的主机名和端口号。需要指出的是,随着页面向下的y坐标轴与真正的时间值不是成比例的。当出现一个有意义的时间段时,在本例中是每5秒之间的重发,我们就在时间系列的两侧作上标记。当U D P或T C P数据正在被传送时,我们用粗线的行来表示。

当I C M P报文返回时,为什么 T F T P客户程序还要继续重发请求呢?这是由于网络编程中的一个因素,即B S D系统不把从插口( s o c k e t )接收到的I C M P报文中的U D P数据通知用户进程,除非该进程已经发送了一个 c o n n e c t命令给该插口。标准的 BSD TFTP客户程序并不发送c o n n e c t命令,因此它永远也不会收到 I C M P差错报文的通知。

这里需要注意的另一点是 T F T P客户程序所采用的不太好的超时重传算法。它只是假定 5秒是足够的,因此每隔 5秒就重传一次,总共需要 2 5秒钟的时间。在后面我们将看到 T C P有一个较好的超时重发算法。

T F T P客户程序所采用的超时重传算法已被R F C所禁用。不过,在作者所在子网上的三个系统以及Solaris 2.2仍然在使用它。AIX 3.2.2采用一种指数退避方法来设置超时值,分别在0、5、1 5和3 5秒时重发报文,这正是所推荐的方法。我们将在第 2 1章更详细地讨论超时问题。

最后需要指出的是,I C M P报文是在发送U D P数据报3.5 ms后返回的,这与第7章我们所看到的P i n g应答的往返时间差不多。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 速读原著-TCP/IP(拥塞举例)

    通过使用t c m d u m p和插口排错选项(在第 2 1 . 4节进行了介绍)来观察一个连接,就会在发送每一个报文段时看到 c w n d和s s t h...

    cwl_java
  • 速读原著-TCP/IP(TCP的正常数据流)

    我们以从主机s v r 4单向传输8 1 9 2个字节到主机 b s d i开始。在b s d i上运行s o c k程序作为服务器:

    cwl_java
  • 速读原著-TCP/IP(ICMP:Internet控制报文协议)

    I C M P经常被认为是 I P层的一个组成部分。它传递差错报文以及其他需要注意的信息。I C M P报文通常被I P层或更高层协议( T C P或U D P...

    cwl_java
  • 速读原著-TCP/IP(拥塞举例)

    通过使用t c m d u m p和插口排错选项(在第 2 1 . 4节进行了介绍)来观察一个连接,就会在发送每一个报文段时看到 c w n d和s s t h...

    cwl_java
  • 计算机网络之网络安全基础-消息完整性与数字签名

    (1). 发送方对报文m应用散列函数, 得到固定长度的散列码, 获得报文摘要h, 将扩展报文(m,h)发送给接收方;

    越陌度阡
  • php一步一步实现mysql协议(三) ——登录认证密码加密

    认证阶段抓包如上图,和初始化握手一样,前四个字节属于消息头,后面的部分属于消息体 。报文的结构图如下:

    码缘
  • 计算机网络学习记录(不断更新)

    平时TTL减为0时最后一个经手的路由器会返回TTL-Exceeded报文,到目的主机后由于端口大于30000,会返回Port-Unreachable报文,这样就...

    xiaoxi666
  • 基于Ryu打造自定义控制器

    控制器是SDN网络中最重要的组成部分。在开发SDN应用时,需要基于某一个控制器开发,而大部分开源控制器都是一个框架或者平台,更多个性化的设置和应用需要开发者自己...

    SDNLAB
  • 速读原著-TCP/IP(ICMP:Internet控制报文协议)

    I C M P经常被认为是 I P层的一个组成部分。它传递差错报文以及其他需要注意的信息。I C M P报文通常被I P层或更高层协议( T C P或U D P...

    cwl_java
  • 网络安全

    对称密钥中,加解密双方难以使用相同密钥,难以事先确定使用一样的密钥。如果网上传输密钥,也会被人截取(截取后,该信息不会发给接收方,只能由接收方发)知道的,恶意者...

    intsmaze-刘洋

扫码关注云+社区

领取腾讯云代金券