未解决
此帖子已超过 5 年
2 Intern
•
1.2K 消息
31
508066
网络基本功系列:细说网络那些事儿(3月26日更新)
网络基本功(一):细说网络传输
转载请在文首保留原文出处:EMC中文支持论坛https://community.emc.com/go/chinese
介绍
常言道:欲练神功,必先练好基本功。之前做了一个关于IP路由,默认网关和掩码的问答贴,做完这个帖子觉得如果对网络知识点做一个系统的阐述,应该会很有帮助。
本系列文章着重于讲解网络管理实际应用中常常涉及的重要知识点,尽量以实用为主。准备写的几个章节暂时有(可能会有增减):
- 网络传输
- 交换机
- VLAN与Trunk
- 路由(上)
- 路由(下)
- 链路聚合
- IP地址与子网
- NAT原理与配置
- ICMP与ARP
- TCP滑动窗口
- TCP重传
- TCP确认机制
- TCP窗口调整与流控
- Wireshark抓包实例诊断TCP连接问题 (精)
- Wireshark抓包实例诊断TCP重传 (精)
- Wireshark抓包实例诊断TCP重复ACK与乱序 (精)
- Wireshark抓包实例诊断TCP窗口与reset (精)
- Wireshark抓包实例诊断HTTP问题 (精)
- Wireshark抓包实例诊断数据库问题
- HTTP(上)
- HTTP(下)
- DNS(上) (NEW)
- 细说Linux网络配置(上)
- 细说Linux网络配置(下)
- 常用诊断工具:ping
- 网络性能监测与实例(上)
- 网络性能监测与实例(下)
- tcpdump的妙用 (上)
- tcpdump的妙用(下)
更多信息
首先来看一个例子:
示例:网络服务器向客户端传送数据的过程:
在详细阐述网络传输过程之前,先来看一个最常见的例子,下图显示了一个网络服务器向客户端传送数据的完整过程:
1. 需要传送的数据是网络服务器的HTML页面。
2. 应用协议HTTP报文头添加到HTML数据之前。报文头信息包括:服务器所使用的HTTP版本,以及表明它包含发给网络客户端信息的状态编码。
3. HTTP应用层协议将HTML格式的网页数据发送给传输层。TCP传输层用于管理网络服务器和客户端之间的会话。
4. IP信息添加到TCP信息之前。IP指定适当的源和目的IP地址。这些信息就构成了IP报文。
5. 以太网协议添加到IP报文的两端之后,就形成了数据链路帧。上述帧发送至通向网络客户端的路径上的最近一个路由器。路由器移除以太网信息,观察IP报文,判定最佳路径,将报文插入一个新的帧,并发送至目标路径上下一个相邻路由器。每一个路由器在转发之前都移除并添加新的数据链路层信息。
6. 数据通过互联网络传输,互联网络包含媒介和中间设备。
7. 客户端接收到包含数据的数据链路帧,处理各层协议头,之后以添加时相反的顺序移除协议头。首先处理并移除以太网信息,之后是IP协议信息,接下来TCP信息,最后是HTTP信息。
8. 之后,将网页信息传递给客户端网页浏览器软件。
数据封装:
消息要在网络中传输,必须对它进行编码,以特定的格式进行封装,同时需要适当地封装以足够的控制和地址信息,以使它能够从发送方移动到接收方。
消息大小
理论上,视频或邮件信息是能够以大块非中断型流从网络源地址传送到目的地址,但这也意味着同一时刻同一网络其他设备就无法收发消息。这种大型数据流会造成显著延时。并且,如果传输过程中连接断开,整个数据流都会丢失需要全部重传。因此更好的方法是将数据流分割(segmentation)为较小的,便于管理的片段,能够带来两点好处:
· 发送较小片段,网络上同时可有多个会话交错进行。这种在网络上将不同会话片段交错进行的过程称为多路传输(multiplexing)。
· 分割可提高网络通讯的可靠性。各消息片段从源地址到目的地址无需经过相同路径,如果一条路径被堵塞或断开,其余消息可从替换路径到达目的地址。如果部分消息到不了目的地址,那只需重传丢失部分。
通过对片段打上标签的方式来保证顺序以及在接收时重组。
协议数据单元(Protocol Data Unit, PDU)
应用层数据在传输过程中沿着协议栈传递,每一层协议都会向其中添加信息。这就是封装的过程。
数据片段在各层网络结构中采用的形式就称为协议数据单元(PDU)。封装过程中,下一层对从上一层收到的PDU进行封装。在处理的每一个阶段PDU都有不同的名字来反应它的功能。
PDU按照TCP/IP协议的命名规范:
· 数据(Data):应用层PDU的常用术语
· 分段(Segment):传输层PDU
· 帧(Frame):网络层PDU
· 比特(Bits):在介质上物理传输数据所使用的PDU。
封装
封装是指在传输之前为数据添加额外的协议头信息的过程。在绝大多数数据通信过程中,源数据在传输前都会封装以数层协议。在网络上发送消息时,主机上的协议栈从上至下进行操作。
以网络服务器为例,HTTP应用层协议发送HTML格式网页数据到传输层,应用层数据被分成TCP分段。各TCP分段被打上标签,称为头(header),表明接收方哪一个进程应当接收此消息。同时也包含使得接收方能够按照原有的格式来重组数据的信息。
传输层将网页HTML数据封装成分段并发送至网络层,执行IP层协议。整个TCP分段封装成IP报文,也就是再添上IP头标签。IP头包括源和目的IP地址,以及发送报文到目的地址所必须的信息。
之后,IP报文发送到接入层,封装以帧头和帧尾。每个帧头都包含源和目的物理地址。物理地址唯一指定了本地网络上的设备。帧尾包含差错校正信息。最后,由服务器网卡将比特编码传输给介质。
解封装
接收主机以相反的方式进行操作称为解封装。解封装是接收设备移除一层或多层协议头的过程。数据在协议栈中向上移动直到终端应用层伴随着解封装。
访问本地资源:
访问本地网络资源需要两种类型的地址:网络层地址和数据链路层地址。网络层和数据链路层负责将数据从发送设备传输至接收设备。两层协议都有源和目的地址,但两种地址的目的不同。
示例:客户端PC1与FTP在同一IP网络的通信
网络地址
网络层地址或IP地址包含两个部分:网络前缀和主机。路由器使用网络前缀部分将报文转发给适当的网络。最后一个路由器使用主机部分将报文发送给目标设备。同一本地网络中,网络前缀部分是相同的,只有主机设备地址部分不同。
源IP地址:发送设备,即客户端PC1的IP地址:192.168.1.110
目的IP地址:接收设备,即FTP服务器:192.168.1.9
数据链路地址
数据链路地址的目的是在同一网络中将数据链路帧从一个网络接口发送至另一个网络接口。以太网LAN和无线网LAN是两种不同物理介质的网络示例,分别有自己的数据链路协议。
当IP报文的发送方和接收方位于同一网络,数据链路帧直接发送到接收设备。以太网上数据链路地址就是以太网MAC地址。MAC地址是物理植入网卡的48比特地址。
源MAC地址:发送IP报文的PC1以太网卡MAC地址,AA-AA-AA-AA-AA-AA。
目的MAC地址:当发送设备与接收设备位于同一网络,即为接收设备的数据链路地址。本例中,FTP MAC地址:CC-CC-CC-CC-CC-CC。
源和目的MAC地址添加到以太网帧中。
MAC与IP地址
发送方必须知道接收方的物理和逻辑地址。发送方主机能够以多种方式学习到接收方的IP地址:比如域名系统(Domain Name System, DNS),或通过应用手动输入,如用户指定FTP地址。
以太网MAC地址是怎么识别的呢?发送方主机使用地址解析协议(Address Resolution Protocol, ARP)以检测本地网络的所有MAC地址。如下图所示,发送主机在整个LAN发送ARP请求消息,这是一条广播消息。ARP请求包含目标设备的IP地址,LAN上的每一个设备都会检查该ARP请求,看看是否包含它自身的IP地址。只有符合该IP地址的设备才会发送ARP响应。ARP响应包含ARP请求中IP地址相对应的MAC地址。
访问远程资源:
默认网关
当主机发送消息到远端网络,必须使用路由器,也称为默认网关。默认网关就是位于发送主机同一网络上的路由器的接口IP地址。有一点很重要:本地网络上的所有主机都能够配置自己的默认网关地址。如果该主机的TCP/IP设置中没有配置默认网关地址,或指定了错误的默认网关地址,则远端网络消息无法被送达。
如下图所示,LAN上的主机PC 1使用IP地址为192.168.1.1的R1作为默认网关,如果PDU的目的地址位于另一个网络,则主机将PDU发送至路由器上的默认网关。
与远端网络设备通讯
下图显示了客户端主机PC 1与远端IP网络服务器进行通讯的网络层地址与数据链路层地址:
网络地址
当报文的发送方与接收方位于不同网络,源和目的IP地址将会代表不同网络上的主机。
源IP地址:发送设备即客户端主机PC 1的IP地址:192.168.1.110。
目的IP地址:接收设备即网络服务器的IP地址:172.16.1.99。
数据链路地址
当报文的发送方与接收方位于不同网络,以太网数据链路帧无法直接被发送到目的主机。以太网帧必须先发送给路由器或默认网关。本例中,默认网关是R1,R1的接口IP地址与PC 1属于同一网络,因此PC 1能够直接达到路由器。
源MAC地址:发送设备即PC 1的MAC地址,PC1的以太网接口MAC地址为:AA-AA-AA-AA-AA-AA。
目的MAC地址:当报文的发送方与接收方位于不同网络,这一值为路由器或默认网关的以太网MAC地址。本例中,即R1的以太网接口MAC地址,即:11-11-11-11-11-11。
IP报文封装成的以太网帧先被传输至R1,R1再转发给目的地址即网络服务器。R1可以转发给另一个路由器,如果目的服务器所在网路连接至R1,则直接发送给服务器。
发送设备如何确定路由器的MAC地址?每一个设备通过自己的TCP/IP设置中的默认网关地址得知路由器的IP地址。之后,它通过ARP来得知默认网关的MAC地址,该MAC地址随后添加到帧中。
kinolucky163
9 消息
0
2014年10月30日 22:00
谢谢解答!但还是有点不理解,客户端的“发送窗口”已经为0,关闭了,怎么还会发送传输数据请求? 请求里有什么?
还有一个问题想问一下,最开始的时候,双方是如何协商确定最初“发送窗口”的大小的?
Zhang_Jiawen
2 Intern
2 Intern
•
1.2K 消息
0
2014年10月30日 23:00
即使服务器端接收窗口关闭了,客户端还是会定期发送探测信息(含有0或1字节数据)至服务器端,以促使服务器端发回当前的窗口大小值,一直保持发送直到服务器接收窗口reopen为止。
TCP的发送窗口大小由接收方来决定,连接建立初始的接收窗口启动门限值应当是一个固定值,比如10或12个报文段单位。
kinolucky163
9 消息
0
2014年10月30日 23:00
谢谢!明白了!
Zhang_Jiawen
2 Intern
2 Intern
•
1.2K 消息
0
2014年10月31日 00:00
不客气。如有问题欢迎继续来讨论。
Zhang_Jiawen
2 Intern
2 Intern
•
1.2K 消息
0
2014年11月2日 16:00
网络基本功(十三):细说Linux网络配置(下)
转载请在文首保留原文出处:EMC中文支持论坛https://community.emc.com/go/chinese
介绍
本文承接细说Linux网络配置(上) 。
更多信息
Linux网络硬件选项:
ethtool命令查询并设置网络接口关于媒体相关的参数。如:链路速度和双工。它代替了以前的mii-tool命令,但有些系统中两者并存。
只要简单加上接口名就可以查询它的状态。例如,eth0接口(PC主板的网卡接口)启动了自协商并且运行于全速率:
将该接口锁定在100 Mb/s全双工,使用以下命令:
ethtool -s eth0 speed 100 duplex full
如果想知道自协商在系统中是否可靠,也可以使用ethtool –r命令,可使链路参数立刻重新协商。
另一个有用的选项是-k,显示哪些协议相关任务指定给网络接口,而不是由内核执行。大多数接口能够计算校验和(checksum),一些也可以辅助分段任务。可以通过ethtool –K命令结合多个子选项开启或禁用特定类型的offloading(-k显示当前值,-K对其进行设置)。
通过ethtool所做的变更是暂时的。如果希望永久性更改,需要确保ethtool作为系统网络配置的一部分来运行。最好是把它作为各个接口配置的一部分,如果你只是在启动时运行一些ethtool命令,那么在接口重启而系统未重启时配置就无法正确生效。
注:Red Hat系统中,可以在/etc/sysconfig/network-scripts. ifup下的配置文件中添加一行ETHTOOL_OPTS=,以将整行作为参数传递给ethtool。
SUSE中ethtool的用法与Red Hat相似,但是选项名为ETHTOOL_OPTIONS,配置文件保存在/etc/sysconfig/network。
Ubuntu系统中,可以在 /etc/network/interfaces的接口配置脚本中运行ethtool命令。
Linux TCP/IP选项:
Linux将每个可调内核变量放在/proc虚拟文件系统中。网络变量位于/proc/sys/net/ipv4。以下是一些重要变量的列表:
许多名字中含有rate和max的变量用作阻止服务器攻击。子目录conf包含按照各接口设置的变量,包括all和default以及各接口子目录(包括loopback)。各子目录包含相同的一组文件。
假设用户在conf/eth0子目录中更改了一个变量,则变更仅适用于该接口。如果在conf/all中更改了变量值,你也许认为更改适用于所有接口,但实际上并非如此。每一个变量对于接收通过all所作的更改有各自的规则。有些是与当前值做或运算,有些是做与运算,还有些是取最大或最小值。除了内核代码以外没有文档详细说明这一过程,因此最好避免这样做,比较好的做法是对各接口分别做修改。
如果用户在conf/default中修改了变量,新的值会传递到所有在这之后配置的接口。另一方面,最好保持默认值不变,以供取消更改时参考。
/proc/sys/net/ipv4/neigh目录同样包含了各接口子目录。子目录中的文件掌控相应接口的ARP table管理以及IPv6邻居发现。以下是变量列表,以gc(代表垃圾回收)开头的变量决定ARP table表项超时以及丢弃。
要查看变量值,使用cat命令,要进行设置,使用echo重定向到合适的文件名。例如:
ubuntu$ cat icmp_echo_ignore_broadcasts0
显示当变量值为0时,则广播ping不能被忽略。要将它设置为1,在 /proc/sys/net 中,运行
ubuntu$ sudo sh -c "echo 1 > icmp_echo_ignore_broadcasts"
通常,你登录的网络与调整的网络是同一个,所以要小心行事。在更改生产设备配置前务必在台式机上测试。
要永久更改某参数(更准确的说,系统每次启动时都重置该值),在/etc/sysctl.conf中添加合适的变量,这些变量在启动时由sysctl命令读取。文件sysctl.conf的格式是变量名=值,而不是手动在shell中修改的格式echo value > variable。变量名是相对于/proc/sys的路径,可以用点或斜杠。例如:
/etc/sysctl.conf 文件中,
net.ipv4.ip_forward=0
net/ipv4/ip_forward=0
都会将主机IP转发关闭。
同时,内核源版本中的 ip-sysctl.txt文件也有一些比较好的注释信息。
参考
Unix and Linux System Administration Handbook
kinolucky163
9 消息
0
2014年11月3日 04:00
Hi,能不能简单普及一下数据是如何在物理层传输的?比如1个字节的8位是如何转换成电子信号传输的?如果超过网线距离的限制,会怎么样,当中是发生了什么?数据丢包是如何产生的?想不明白如果一端发送了数据,另一端为什么会收不到,如果不跨路由器之类的?如果想了解的话,是不是需要看数字电子、模拟电子、电子通信方面的书?
Zhang_Jiawen
2 Intern
2 Intern
•
1.2K 消息
0
2014年11月3日 18:00
丢包的常见原因,举个例子来说:双11快递包裹数量剧增,来不及传输,于是造成仓库积压,当仓库积满了无法再继续承载包裹,于是多余的包裹就只能丢弃了。
Zhang_Jiawen
2 Intern
2 Intern
•
1.2K 消息
0
2014年11月3日 18:00
数据在底层的传输,从硬件角度来看就是从芯片的某一引脚输出高低电平经各总线到另一芯片(或至外部总线),再底层的我不在行了。其实看完全部这些书也不一定对实际工作有多大帮助,不过确实没有快速入门的方法,最好是从工作中积累。
Zhang_Jiawen
2 Intern
2 Intern
•
1.2K 消息
0
2014年11月3日 19:00
如果在接收端直接量数据电平信号,是能量得出来的。只是芯片发现buffer不够,或校验发现数据出错等情况,会做出将数据丢弃的决定。只是这种决策不发生在物理层。
kinolucky163
9 消息
0
2014年11月3日 19:00
谢谢,明白了!
kinolucky163
9 消息
0
2014年11月3日 19:00
谢谢回复!对于丢包,发送端发送数据给接收端,发送端认为发送出去了,接收端没收到,有点好奇这种丢包会在哪几个环节发生。 发送端将数据组成帧(假设这个包只有一个帧),芯片负责将帧数据转换成高低电压, 按说接收端一定会感知到这些高低电压, 再转换成数据,不应该丢啊。是不是接收端一定会收到,只是没地方放,才会丢包?
xixihaha
3 消息
0
2014年11月7日 00:00
看完《网络基本功(五):细说路由(下)》有个疑问:
路由器有动态学习,即使不相连,也可以学习。那岂不是每个路由器都有整个互联网的路由信息??
xixihaha
3 消息
0
2014年11月7日 01:00
能否详细举例讲一讲?最好能结合实际,比如,杭州某用户访问百度北京机房的www.baidu.com,是怎么路由器的?
Zhang_Jiawen
2 Intern
2 Intern
•
1.2K 消息
0
2014年11月7日 01:00
动态路由协议其实是相邻路由器之间定期发送状态更新,但关键是从每一台路由器的局部网络信息中需要用算法推出整个网络的结构。
Roger_Wu
2 Intern
2 Intern
•
4K 消息
0
2014年11月7日 01:00
理论上是啊,不过呢,路由表是可以聚合的,几十个甚至上百个C段地址在上层甚至骨干网路由器上合并成一个B段地址就行了。