udp协议分析实验报告答案(udp实验报告总结)

http://www.itjxue.com  2023-02-14 15:57  来源:未知  点击次数: 

网络协议UDP问题

源端口1586,目的端口69,UDP用户数据报总长度28字节,数据部分长度20字节。

此UDP用户数据报是从客户发给服务器(因为目的端口号1023,是熟知端口)、服务器程序是TFFTP。

利用分组嗅探器分析HTTP和DNS (TCP/ip 的实验 我想得到这个实验的具体和实验报告的答案?

wireshark 自己抓包看啊

里面写的很清楚

HTTP 端口80 TCP连接 进入网络层 封装 协议号=6 然后进入 数据链路层

DNS 53端口号 一次 封装。。。。TCP UDP 2种

不懂Q 我

·04年8月出版的计算机网络基础与实训习题答案 主编刘钢

1:计算机网络是一种地理上分散、具有独立功能的多台计算机通过软、硬件设备互连,以实现资源共享和信息交换的系统。计算机网络必须有以下三个要素:

两台或两台以上独立的计算机互连接起来才能构成网络,达到资源共享目的。

计算机之间要用通信设备和传输介质连接起来。

计算机之间要交换信息,彼此就需要一个统一的规则,这个规则成为“网络协议”(Protocol TCP/IP)。网络中的计算机必须有网络协议。

2:金桥工程、金关工程和金卡工程

3:计算机网络的功能主要体现在三个方面:信息交换、资源共享、分布式处理。

⑴信息交换

这是计算机网络最基本的功能,主要完成计算机网络中各个节点之间的系统通信。用户可以在网上传送电子邮件、发布新闻消息、进行电子购物、电子贸易、远程电子教育等。

⑵资源共享

所谓的资源是指构成系统的所有要素,包括软、硬件资源,如:计算处理能力、大容量磁盘、高速打印机、绘图仪、通信线路、数据库、文件和其他计算机上的有关信息。由于受经济和其他因素的制约,这些资源并非(也不可能)所有用户都能独立拥有,所以网络上的计算机不仅可以使用自身的资源,也可以共享网络上的资源。因而增强了网络上计算机的处理能力,提高了计算机软硬件的利用率。

⑶分布式处理

一项复杂的任务可以划分成许多部分,由网络内各计算机分别协作并行完成有关部分,使整个系统的性能大为增强。

4:包括软、硬件资源,如:计算处理能力、大容量磁盘、高速打印机、绘图仪、通信线路、数据库、文件和其他计算机上的有关信息。由于受经济和其他因素的制约,这些资源并非(也不可能)所有用户都能独立拥有,所以网络上的计算机不仅可以使用自身的资源,也可以共享网络上的资源。因而增强了网络上计算机的处理能力,提高了计算机软硬件的利用率

5:

通信是指信息的传输,通信具有三个基本要素:

信源:信息的发送者;信宿:信息的接收者;载体:信息的传输媒体。

通信系统基本组成部分见下图:

信源:

发送各种信息(语言、文字、图像、数据)的信息源,如人、机器、计算机等。

信道:

信号的传输载体。从形式上看,主要有有线信道和无线信道两类;从传输方式上看,信道又可分为模拟信道和数字信道两类。

信宿:

信息的接收者,可以是人、机器、计算机等;

变换器:

将信源发出的信息变换成适合在信道上传输的信号。对应不同的信源和信道,变换器有着不同的组成和变换功能。如计算机通信中的调制解调器就是一种变换器。

反变换器

提供与变换器相反的功能,将从信道上接收的电(或光)信号变换成信宿可以接收的信息。

噪声源:

通信系统中不能忽略噪声的影响,通信系统的噪声可能来自于各个部分,包括发送或接收信息的周围环境、各种设备的电子器件,信道外部的电磁场干扰等。

6:异步传输:数据以字符为传输单位,字符发送时间是异步的,即后一字符的发送时间与前一字符的发送时间无关。时序或同步仅在每个字符的范围内是必须的,接收机可以在每个新字符开始是抓住再同步的机会。同步传输:以比

特块为单位进行传输,发送器与接收机之间通过专门的时钟线路或把同步信号嵌入数字信号进行同步。异步传输需要至少20%以上的开销,同步传输效率远远比异步传输高。

7:数据传输速率是描述数据传输系统的重要技术指标之一。数据传输速率在数值上等于每秒种传输构成数据代码的二进制比特数,单位为比特/秒(bit/second),记作bps。对于二进制数据,数据传输速率为:

S=1/T(bps)

其中,T为发送每一比特所需要的时间。例如,如果在通信信道上发送一比特0、1信号所需要的时间是0.001ms,那么信道的数据传输速率为1 000 000bps。

在实际应用中,常用的数据传输速率单位有:kbps、Mbps和Gbps。其中:

1kbps=103bps 1Mbps=106kbps 1Gbps=109bps

带宽与数据传输速率

在现代网络技术中,人们总是以“带宽”来表示信道的数据传输速率,“带宽”与“速率”几乎成了同义词。信道带宽与数据传输速率的关系可以奈奎斯特(Nyquist)准则与香农(Shanon)定律描述。

奈奎斯特准则指出:如果间隔为π/ω(ω=2πf),通过理想通信信道传输窄脉冲信号,则前后码元之间不产生相互窜扰。因此,对于二进制数据信号的最大数据传输速率Rmax与通信信道带宽B(B=f,单位Hz)的关系可以写为:

Rmax=2.f(bps)

对于二进制数据若信道带宽B=f=3000Hz,则最大数据传输速率为6000bps。

奈奎斯特定理描述了有限带宽、无噪声信道的最大数据传输速率与信道带宽的关系。香农定理则描述了有限带宽、有随机热噪声信道的最大传输速率与信道带宽、信噪比之间的关系。

香农定理指出:在有随机热噪声的信道上传输数据信号时,数据传输速率Rmax与信道带宽B、信噪比S/N的关系为:

Rmax=B.log2(1+S/N)

式中,Rmax单位为bps,带宽B单位为Hz,信噪比S/N通常以dB(分贝)数表示。若S/N=30(dB),那么信噪比根据公式:

S/N(dB)=10.lg(S/N)

可得,S/N=1000。若带宽B=3000Hz,则Rmax≈30kbps。香农定律给出了一个有限带宽、有热噪声信道的最大数据传输速率的极限值。它表示对于带宽只有3000Hz的通信信道,信噪比在30db时,无论数据采用二进制或更多的离散电平值表示,都不能用越过0kbps的速率传输数据。

因此通信信道最大传输速率与信道带宽之间存在着明确的关系,所以人们可以用“带宽”去取代“速率”。例如,人们常把网络的“高数据传输速率”用网络的“高带宽”去表述。因此“带宽”与“速率”在网络技术的讨论中几乎成了同义词。

带宽:信号传输频率的最大值和最小值之差(Hz)。信道容量:单位时间内传输的最大码元数(Baud),或单位时间内传输的最大二进制数(b/s)。数据传输速率:每秒钟传输的二进制数(b/s)。

带宽 :信道可以不失真地传输信号的频率范围。为不同应用而设计的传输媒体具有不同的信道质量,所支持的带宽有所不同。

信道容量:信道在单位时间内可以传输的最大信号量,表示信道的传输能力。信道容量有时也表示为单位时间内可传输的二进制位的位数(称信道的数据传输速率,位速率),以位/秒(b/s)形式予以表示,简记为bps。

数据传输率:信道在单位时间内可以传输的最大比特数。信道容量和信道带宽具有正比的关系:带宽越大,容量越大。(这句话是说,信道容量只是在受信噪比影响的情况下的信息传输速率

8:6000bps*30

9: 基带传输又叫数字传输,是指把要传输的数据转换为数字信号,使用固定的频率在信道上传输。例如计算机网络中的信号就是基带传输的。 和基带相对的是频带传输,又叫模拟传输,是指信号在电话线等这样的普通线路上,以正弦波形式传播的方式。我们现有的电话、模拟电视信号等,都是属于频带传输

在数字传输系统中,其传输对象通常是二进制数字信息,它可能来自计算机、网络或其它数字设备的各种数字代码。也可能来自数字电话终端的脉冲编码信号,设计数字传输系统的基本考虑是选择一组有限的离散的波形来表示数字信息。这些离散波形可以是未经调制的不同电平信号,也可以是调制后的信号形式。由于未经调制的脉冲电信号所占据的频带通常从直流和低频开始。因而称为数字基带信号。在某些有线信道中,特别是传输距离不大远的情况下,数字基带信号可以直接传送,我们称之为数字信号的基带传输

上面的传输方式适用于一个单位内部的局域网传输,但除了市内的线路之外,长途线路是无法传送近似于0的分量的,也就是说,在计算机的远程通信中,是不能直接传输原始的电脉冲信号的(也就是基带信号了)。因此就需要利用频带传输,就是用基带脉冲对载波波形的某些参量进行控制,使这些参量随基带脉冲变化,这就是调制。经过调制的信号称为已调信号。已调信号通过线路传输到接收端,然后经过解调恢复为原始基带脉冲。这种频带传输不仅克服了目前许多长途电话线路不能直接传输基带信号的缺点,而且能实现多路复用的目的,从而提高了通信线路的利用率。不过频带传输在发送端和接收端都要设置调制解调器

10.

0 1 0 1 1 0 1 0

1 1 1 0 0 0 0(1)

0 0 0(0)1 1 0 0

1 0(0)1 1 1 0 1

0 0 0 0(1)0 1(0)

11. 优点:1.促进标准化工作,允许各供应商进行开发。2.各层相互独立,把 网络操作分成低复杂性单元。3.灵活性好,某一层的变化不会影响到别层,设计者可专心设计和开发模块功能。4.各层间通过一个接口在相邻层上下通信

原则:计算机网络体系结构的分层思想主要遵循以下几点原则:

1.功能分工的原则:即每一层的划分都应有它自己明确的与其他层不同的基本功能。

2.隔离稳定的原则:即层与层的结构要相对独立和相互隔离,从而使某一层内容或结构的变化对其他层的影响小,各层的功能、结构相对稳定。

3.分支扩张的原则:即公共部分与可分支部分划分在不同层,这样有利于分支部分的灵活扩充和公共部分的相对稳定,减少结构上的重复。

4.方便实现的原则:即方便标准化的技术实现。

12:七层参考模型 第1层:物理层 第2层:数据链路层 第3层:网络层

第4层:传输层 第5层:会话层 第6层:表示层 第7层:应用层

13: MAC(Media Access Control, 介质访问控制)MAC地址是烧录在Network Interface Card(网卡,NIC)里的.MAC地址,也叫硬件地址,是由48比特长(6字节),16进制的数字组成.0-23位是由厂家自己分配.24-47位,叫做组织唯一标志符(organizationally unique ,是识别LAN(局域网)节点的标识

IP是 OSI参考模型中的3层设备使用的 全球唯一的32位 点分10进制地址. 分A B C D E 5类. A B C是用于互联网的. D是广播地址. E是实验室预留的地址. IP地址相当于个人ID,是标识的作用

通过tcp/ip协议

14:“面向连接”就是在正式通信前必须要与对方建立起连接。比如你给别人打电话,必须等线路接通了、对方拿起话筒才能相互通话。

TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂,我们这里只做简单、形象的介绍,你只要做到能够理解这个过程即可。我们来看看这三次对话的简单过程:主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;主机B向主机A发送同意连接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工作)的数据包:“可以,你什么时候发?”,这是第二次对话;主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”,这是第三次对话。三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据。

TCP协议能为应用程序提供可靠的通信连接,使一台计算机发出的字节流无差错地发往网络上的其他计算机,对可靠性要求高的数据通信系统往往使用TCP协议传输数据。

面向非连接的UDP协议

“面向非连接”就是在正式通信前不必与对方先建立连接,不管对方状态就直接发送。这与现在风行的手机短信非常相似:你在发短信的时候,只需要输入对方手机号就OK了。

UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去!

UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境。比如,我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。例如,在默认状态下,一次“ping”操作发送4个数据包(如图2所示)。大家可以看到,发送的数据包数量是4包,收到的也是4包(因为对方主机收到后会发回一个确认收到的数据包)。这充分说明了UDP协议是面向非连接的协议,没有建立连接的过程。正因为UDP协议没有连接的过程,所以它的通信效果高;但也正因为如此,它的可靠性不如TCP协议高。QQ就使用UDP发消息,因此有时会出现收不到消息的情况。

TCP协议和UDP协议各有所长、各有所短,适用于不同要求的通信环境。

15:物理层:物理层(Physical layer)是参考模型的最低层。该层是网络通信的数据传输介质,由连接不同结点的电缆与设备共同构成。主要功能是:利用传输介质为数据链路层提供物理连接,负责处理数据传输并监控数据出错率,以便数据流的透明传输。

? 数据链路层:数据链路层(Data link layer)是参考模型的第2层。 主要功能是:在物理层提供的服务基础上,在通信的实体间建立数据链路连接,传输以“帧”为单位的数据包,并采用差错控制与流量控制方法,使有差错的物理线路变成无差错的数据链路。

? 网络层:网络层(Network layer)是参考模型的第3层。主要功能是:为数据在结点之间传输创建逻辑链路,通过路由选择算法为分组通过通信子网选择最适当的路径,以及实现拥塞控制、网络互联等功能。

? 传输层:传输层(Transport layer)是参考模型的第4层。主要功能是向用户提供可靠的端到端(End-to-End)服务,处理数据包错误、数据包次序,以及其他一些关键传输问题。传输层向高层屏蔽了下层数据通信的细节,因此,它是计算机通信体系结构中关键的一层。

? 会话层:会话层(Session layer)是参考模型的第5层。主要功能是:负责维扩两个结点之间的传输链接,以便确保点到点传输不中断,以及管理数据交换等功能。

? 表示层:表示层(Presentation layer)是参考模型的第6层。主要功能是:用于处理在两个通信系统中交换信息的表示方式,主要包括数据格式变换、数据加密与解密、数据压缩与恢复等功能。

? 应用层:应用层(Application layer)是参考模型的最高层。主要功能是:为应用软件提供了很多服务,例如文件服务器、数据库服务、电子邮件与其他网络软件服务。

16。CSMA/CD(Carrier Sense Multiple Access/Collision Detection)带冲突检测的载波监听多路访问协议。分为非坚持型监听算法、1-坚持型监听算法和P-坚持型监听算法。

在局域网上,经常是在一条传输介质上连有多台计算机,如总线型和环型局域网,大家共享使用一条传输介质,而一条传输介质在某一时间内只能被一台计算机所使用,那么在某一时刻到底谁能使用或访问传输介质呢?这就需要有一个共同遵守的方法或原则来控制、协调各计算机对传输介质的同时访问,这种方法,这种方法就是协议或称为介质访问控制方法。目前,在局域网中常用的传输介质访问方法有:以太(Ethernet)方法、令牌(Token Ring)、FDDE方法、异步传输模式(ATM)方法等,因此可以把局域网分为以太网(Ethernet)、令牌网(Token Ring)、FDDE网、ATM网等

17:局域网的拓扑(Topology)结构是指网络中各节点的互连构型,也就是局域网的布线方式。常见的拓扑结构有星型、总线型及环型等。

18:共享式的话,通过总线这一共享介质使PC全部连通.

交换式局域网是用机与机之间,通过VLAN(虚拟局域网)划分不同的网段.

从而使同一网段的PC可以通信,

最后有三点不同,

.数据转发给哪个端口,交换机基于MAC地址作出决定,集线器根本不做决定,而是将数据转发给所有端口.数据在交换机内部可以采用独立路径,在集线器中所有的数据都可以在所有的路径上流动.

2.集线器所有端口共享一个带宽,交换即每个端口有自己独立的带宽,互不影响.

3.集线器所有端口均是同一个冲突域,而交换机每个端口下是一 个独立的冲突域

19:5-4-3规则,是指任意两台计算机间最多不能超过5段线(既包括集线器到集线器的连接线缆,也包括集线器到计算机间的连接线缆)、4台集线器,并且只能有3台集线器直接与计算机等网络设备连接。

20:CSMA/CD(Carrier Sense Multiple Access/Collision Derect),即载波监听多路访问/冲突检测方法是一种争用型的介质访问控制协议。它起源于美国夏威夷大学开发的ALOHA网所采用的争用型协议,并进行了改进,使之具有比ALOHA协议更高的介质利用率。

CSMA/CD是一种分布式介质访问控制协议,网中的各个站(节点)都能独立地决定数据帧的发送与接收。每个站在发送数据帧之前,首先要进行载波监听,只有介质空闲时,才允许发送帧。这时,如果两个以上的站同时监听到介质空闲并发送帧,则会产生冲突现象,这使发送的帧都成为无效帧,发送随即宣告失败。每个站必须有能力随时检测冲突是否发生,一旦发生冲突,则应停止发送,以免介质带宽因传送无效帧而被白白浪费,然后随机延时一段时间后,再重新争用介质,重发送帧。CSMA/CD协议简单、可靠,其网络系统(如Ethernet)被广泛使用

21:只需给出一个判断,若是独立IP,则返回TRUE,若不是,则返回FALSE……

22:1.基本地址格式

现在的IP网络使用32位地址,以点分十进制表示,如172.16.0.0。地址格式为:IP地址=网络地址+主机地址 或 IP地址=主机地址+子网地址+主机地址。

网络地址是由Internet权力机构(InterNIC)统一分配的,目的是为了保证网络地址的全球唯一性。主机地址是由各个网络的系统管理员分配。因此,网络地址的唯一性与网络内主机地址的唯一性确保了IP地址的全球唯一性。

2.保留地址的分配

根据用途和安全性级别的不同,IP地址还可以大致分为两类:公共地址和私有地址。公用地址在Internet中使用,可以在Internet中随意访问。私有地址只能在内部网络中使用,只有通过代理服务器才能与Internet通信。

公用IP地址被分为基本三类。

Class A 1.0.0.0-126.255.255.255

Class B 128.0.0.0-191.255.255.255

Class C 192.0.0.0 -255.255.255.255

这三个基本类决定了你可以拥有多少的次网络(subnets) 和连接多少的用户(devices)(服务器,网关,打印机,电脑等)

Class A 拥有3个host.

Class B 拥有2个host.

Class C 拥有1个host.

Class A 可以适用于超级大公司或者政府机关

Class B 可以适用于普通的集团公司或者学校

Class C 可以适用于一般公司

一个机构或网络要连入Internet,必须申请公用IP地址。但是考虑到网络安全和内部实验等特殊情况,在IP地址中专门保留了三个区域作为私有地址,其地址范围如下:

10.0.0.0/8:10.0.0.0~10.255.255.255

172.16.0.0/12:172.16.0.0~172.31.255.255

192.168.0.0/16:192.168.0.0~192.168.255.255

使用保留地址的网络只能在内部进行通信,而不能与其他网络互连。因为本网络中的保留地址同样也可能被其他网络使用,如果进行网络互连,那么寻找路由时就会因为地址的不唯一而出现问题。但是这些使用保留地址的网络可以通过将本网络内的保留地址翻译转换成公共地址的方式实现与外部网络的互连。这也是保证网络安全的重要方法之一。

23:

平常使用的IP地址,基本上是A、B、C三类,这三类地址都有各自的默认子网掩码,如果更改默认的子网掩码,使IP地址中原来应该是用来表示主机的位现在用于表示网络号,这些“借用”的主机位就是子网位,可用于表示不同的子网号,从而就是在原来的网络中生成了不同的“子”网。原本划分子网的目的是充分利用IP地址资源,不过现在也用于其他更多的目的。这样的划分子网是纯逻辑层面的,在第三层(网络层)实施的分隔手段,只与使用TCP/IP协议进行通信的应用有关,也即是说,即使两台机器不在同一子网,仍可使用其他协议(如IPX)通信,而且各机器如果有权力修改IP地址的话,随时可以改变自己的IP,使自己位于不同子网中,而虚拟局域网(VLAN)是在第二层(数据链路层)实施的分隔,与协议无关,不同VLAN中的机器,如果没有到达其他VLAN的路由,无论如何更改协议地址,都仍然无法与其他VLAN中的机器通信。

子网掩码是一个32位地址,用于屏蔽IP地址的一部分以区别网络标识和主机标识,并说明该IP地址是在局域网上,还是在远程网上

24:域名是Internet网络上的一个服务器或一个网络系统的名字,在全世界,没有重复的域名域名具有唯一性。从技术上讲,域名只是一个Internet中用于解决地址对应问题的一种方法。可以说只是一个技术名词。但是,由于Internet已经成为了全世界人的Internet,域名也自然地成为了一个社会科学名词

作用:DNS服务器的作用是将域名地址转换为物理地址 kyi

【udp】关于docker 容器网络下使用 UDP 协议无法通讯问题的分析和处理

工作中遇到一个 docker 容器下 UDP 协议网络不通的问题,困扰了很久,也比较有意思,所以想写下来和大家分享。

我们有个应用是基于 UDP 协议的,部署上去发现无法工作,但是换成 TCP 协议是可以的(应用同时支持 UDP、TCP 协议,切换成 TCP 模式发现一切正常)。

虽然换成 TCP 能解决问题,但是我们还是想知道到底 UDP 协议在容器网络模式下为什么会出现这个问题,以防止后面其他 UDP 应用会有异常。

这个问题抽象出来是这样的:如果有 UDP 服务运行在宿主机上(或者运行在网络模型为 host 的容器里),并且监听在 0.0.0.0 地址(也就是所有的 ip 地址),从运行在 docker bridge(网桥为 docker0) 网络的容器运行客户端访问服务,两者通信有问题。

注意以上的的限制条件,通过测试,我们发现下来几种情况都是正常的:

这个问题在 docker 上也有 issue 记录,但是目前并没有合理的解决方案。

这篇文章就分析一下出现这个问题的原因,希望给同样遇到这个问题的读者提供些帮助。

这个问题很容易重现,我的实验是在 ubuntu16.04 下用 netcat 命令完成的,其他系统应该类似。

在宿主机上通过 nc 监听 56789 端口,然后使用 bridge 网络模式,run 一个容器,在容器里面使用 nc 发数据。

第一个报文是能发送出去的,但是以后的报文虽然在网络上能看到,但是对方无法接收。

在宿主机运行 nc UDP 服务器(-u 表示 UDP 协议,-l 表示监听的端口)

注:默认没有指定绑定ip,就是监听在0.0.0.0上。

然后在同一宿主机上,启动一个容器,运行客户端:

nc 的通信是双方的,不管对方输入什么字符,回车后对方就能立即收到。

但是在这个模式下,客户端第一次输入对方能够收到,后续的报文对方都收不到。

在这个实验中,容器使用的是 docker 的默认网络,容器的 ip 是 172.17.0.3,通过 veth pair(图中没有显示)连接到虚拟网桥 docker0(ip 地址为 172.17.0.1),宿主机本身的网络为 eth0,其 ip 地址为 172.16.13.13。

遇到这种疑难杂症,第一个想到的抓包。

我们需要在 docker0 上抓包,因为这是报文必经过的地方。

通过过滤容器的 ip 地址,很容器找到感兴趣的报文:

为了模拟多数应用一问一答的通信方式,我们一共发送三个报文,并用 tcpdump 抓取 docker0 接口上的报文:

抓包的结果如下,可以发现第一个报文发送出去没有任何问题。

UDP 是没有 ACK 报文的,所以客户端无法知道对方有没有收到,这里说的没有问题没有看到对应的 ICMP 差错报文。

但是第二个报文从服务端发送的报文,对方会返回一个 ICMP 告诉端口 38908 不可达;第三个报文从客户端发送的报文也是如此。以后的报文情况类似,双方再也无法进行通信了。

而此时主机上 UDP nc 服务器并没有退出,使用 ss -uan | grep 56789 可能看到它仍然在监听着该端口。

从网络报文的分析中可以看到服务端返回的报文源地址不是我们预想的 eth0 地址,而是 docker0 的地址,而客户端直接认为该报文是非法的,返回了 ICMP 的报文给对方。

那么问题的原因也可以分为两个部分:

第一个问题的关键词是:UDP 和多网络接口。

因为如果主机上只有一个网络接口,发出去的报文源地址一定不会有错;而我们也测试过 TCP 协议是能够处理这个问题的。

通过搜索,发现这确实是个已知的问题。

这个问题可以归结为一句话:UDP 在多网卡的情况下,可能会发生【服务器端】【源地址】不对的情况,这是内核选路的结果。

为什么 UDP 和 TCP 有不同的选路逻辑呢?

因为 UDP 是无状态的协议,内核不会保存连接双方的信息,因此每次发送的报文都认为是独立的,socket 层每次发送报文默认情况不会指明要使用的源地址,只是说明对方地址。

因此,内核会为要发出去的报文选择一个 ip,这通常都是报文路由要经过的设备 ip 地址。

那么,为什么 dnsmasq 服务没有这个问题呢?

于是我使用 strace 工具抓取了 dnsmasq 和出问题应用的网络 socket 系统调用,来查看它们两个到底有什么区别。

dnsmasq 在启动阶段监听了 UDP 和 TCP 的 54 端口

因为是在本地机器上测试的,为了防止和本地 DNS 监听的DNS端口冲突,我选择了 54 而不是标准的 53 端口:

比起 TCP,UDP 部分少了 listen,但是多个 setsockopt(4, SOL_IP, IP_PKTINFO, [1], 4) 这句。

到底这两点和我们的问题是否有关,先暂时放着,继续看传输报文的部分。

dnsmasq 收包和发包的系统调用,直接使用 recvmsg 和 sendmsg 系统调用:

而出问题的 UDP 应用 strace 结果如下:

其对应的逻辑是这样的:使用 ipv6 绑定在 0.0.0.0 和 6088 端口,调用 getsockname 获取当前 socket 绑定的端口信息,数据传输过程使用的是 recvfrom 和 sendto。

对比下来,两者的不同有几点:

因为是在传输数据的时候出错的,因此第一个疑点是 sendmsg 和 sendto 的某些区别导致选择源地址有不同,通过 man sendto 可以知道 sendmsg 包含了更多的控制信息在 msghdr。

一个合理的猜测是 msghdr 中包含了内核选择源地址的信息!

通过查找,发现 IP_PKTINFO 这个选项就是让内核在 socket 中保存 IP 报文的信息,当然也包括了报文的源地址和目的地址。 IP_PKTINFO 和 msghdr 的关系可以在这个 stackoverflow 中找到:

而 man 7 ip 文档中也说明了 IP_PKTINFO 是怎么控制源地址选择的:

如果 ipi_spec_dst 和 ipi_ifindex 不为空,它们都能作为源地址选择的依据,而不是让内核通过路由决定。

也就是说,通过设置 IP_PKTINFO socket 选项为 1,然后使用 recvmsg 和 sendmsg 传输数据就能保证源地址选择符合我们的期望。

这也是 dnsmasq 使用的方案,而出问题的应用是因为使用了默认的 recvfrom 和 sendto。

为什么内核会把源地址和之前不同的报文丢弃,认为它是非法的?

因为我们前面已经说过,UDP 协议是无连接的,默认情况下 socket 也不会保存双方连接的信息。即使服务端发送报文的源地址有误,只要对方能正常接收并处理,也不会导致网络不通。

但是 conntrack 不是这样,内核的 netfilter 模块会保存连接的状态,并作为防火墙设置的依据。

它保存的 UDP 连接,只是简单记录了主机上本地 ip 和端口,和对端 ip 和端口,并不会保存更多的内容。

关于 这块可参考 intables info 网站的文章:

在找到根源之前,我们曾经尝试过用 SNAT 来修改服务端应答报文的源地址,期望能够修复该问题,但是却发现这种方法行不通,为什么呢?

因为 SNAT 是在 netfilter 最后做的,在之前 netfilter 的 conntrack 因为不认识该 connection,直接丢弃了,所以即使添加了 SNAT 也是无法工作的。

那能不能把 conntrack 功能去掉呢?比如解决方案:

答案也是否定的,因为 NAT 需要 conntrack 来做翻译工作,如果去掉 conntrack 等于 SNAT 完全没用。

知道了问题的原因,解决方案也就很容易找到。

nc 可以跟两个参数,分别代表 ip 和 端口,表示服务端监听在某个特定 ip 上。

如果接收到的报文目的地址不是 172.16.13.13,也会被内核直接丢弃,这种情况下,服务端和客户端也能正常通信。

docker 容器网络下 UDP 协议的一个问题

Setting the source IP for a UDP socket

LinuxC下获取UDP包中的路由目的IP地址和头标识目的地址

Source IP address selection

UDP recvmsg 返回目的地址和目的接口信息

告知你不为人知的 UDP:连接性和负载均衡

告知你不为人知的 UDP:疑难杂症和使用

(责任编辑:IT教学网)

更多

推荐站内动态文章