从网卡发送数据再谈TCP/IP协议—网络传输速度计算-网卡构造
Author:[email protected] Date:
在《在深谈TCP/IP三步握手&四步挥手原理及衍生问题—长文解剖IP》里面提到
单个TCP包每次打包1448字节的数据进行发送(以太网Ethernet最大的数据帧是1518字节,以太网帧的帧头14字节和帧尾CRC校验4字节
seq编码,在RFC793中,建议ISN和一个假的时钟绑在一起,这个时钟会在每4微秒对ISN做加一操作,直到超过2^32
据此推算,貌似单一线路,网络传输速度也就1.5*(1/4*10^6) = 375M/bs
对此的论据是:segments packets frame 是一对一的关系,层层套,一个个依次发送,如图所示
如此,岂不是对于千兆网卡,千G、千T,以及5G网络 是 瞎子点灯?
注:
在链路层,由以太网的物理特性决定了数据帧的长度为(46+18)-(1500+18),其中的18是数据帧的头和尾,也就是说数据帧的内容最大为1500(不包括帧头和帧尾),即MTU(Maximum Transmission Unit)为1500;
在网络层,因为IP包的首部要占用20字节,所以这的MTU为1500-20=1480;
在传输层,对于UDP包的首部要占用8字节,所以这的MTU为1480-8=1472;
所以,在应用层,你的Data最大长度为1472。当我们的UDP包中的数据多于MTU(1472)时,发送方的IP层需要分片fragmentation进行传输,而在接收方IP层则需要进行数据报重组,由于UDP是不可靠的传输协议,如果分片丢失导致重组失败,将导致UDP数据包被丢弃。
千兆网卡理论最大传输速度是(1024Mbit/s=128MByte/s),注意b与B差了8倍。
这个迷惑一直困扰着我。百思不得骑姐
Mathis方程
TCP吞吐量 = (MSS *C) / (RTT * sqrt(Loss))
其中:
MSS( Maximum Segment Size)是最大段大小,指的是TCP传输中,每个段(segment)可以包含的最大数据量,不包括TCP头部和IP头部。
RTT(Round-Trip Time)是往返时间,,指的是一个数据包从发送方发送到接收方,再从接收方返回发送方所需的时间。
C(Mathis Equation Constant是一个常数,其值约为1.22。它来自于TCP Reno拥塞控制算法的一个理论分析,用于计算在存在丢包的情况下TCP的最大吞吐量——由Mathis、Semke、Mahdavi、Ott在1997年的研究中提出,故称:Mathis方程常数(Mathis为一作)。
Loss是丢包率
这个公式是基于TCP的拥塞控制算法,特别是在考虑丢包时的TCP Reno算法。
然后开始,重新琢磨所学内容(基础学的不扎实)!
从网卡发送接收数据入手,对TCP/IP再开垦一番
网卡如何发送数据包:
IP报文可以看作一个包。
Linux网卡驱动程序,将IP包添加14字节的MAC包头,构成MAC包。
MAC包中含有发送端和接收端的MAC地址信息。既然是驱动程序创建的MAC包头信息,当然可以随便输入地址信息的,主机伪装就是这么实现的。
驱动程序将MAC包拷贝到网卡芯片内部的缓存区,就算完事了。有网卡芯片接手处理。网卡芯片对MAC包,再次封装成物理帧,添加头部同步信息和CRC校验。然后丢到网线上,就完成一个IP报文的发送。所有挂接到本网线的网卡都可以看到该物理帧。
网卡接收数据包
正常情况:
网线上的物理帧首先被网卡芯片获取,网卡芯片会检查物理帧的CRC,保证完整性。
其次,网卡芯片将物理帧头去掉,得到MAC包。
网卡芯片检查MAC包内的目的MAC地址信息,和本网卡的MAC地址是否一致?不一致,抛弃。
网卡芯片将MAC帧拷贝到网卡内部的缓冲区,触发中断。
驱动程序通过中断,将MAC包拷贝到系统中,构建sk_buff。告诉上层。
上层去掉MAC包头,得到需要的IP包。
过程中,网卡芯片对物理帧进行了MAC匹配过滤。这样做可以减小系统负荷。
试想一下,若网卡芯片对所有的MAC帧不加判断的直接提供给驱动,让CPU判决会是什么样子呢?
当总线上数据繁忙,CPU将浪费大部分时间去判断该MAC包是否是自己需要的,效率低下。
不正常模式(混听):
网线上的物理帧首先被网卡芯片获取,网卡芯片会检查物理帧的CRC,保证完整性。
其次,网卡芯片将物理帧头去掉,得到MAC包。
网卡芯片发现自己当前被配置为混听模式,就不对MAC包过滤。
网卡芯片将MAC帧拷贝到网卡内部的缓冲区,触发中断。
驱动程序通过中断,将MAC包拷贝到系统中,构建sk_buff。告诉上层。
上层去掉MAC包头,得到需要的IP包。
显然,这里的IP包并一定是发给自己的。
驱动的问题
网卡到底能不能接收其他MAC包,完全取决于网卡芯片中RCR(receive control register)配置。
驱动程序是决定网卡能否工作与混听模式的桥梁。
混听模式会加重CPU的负荷,而且也是不符合标准应用的!
所有的车辆都要从加油站穿过,(有些都不加油),加油站工作人员的任务量就可想而知。
当然也有例外,有些程序不通过驱动,也可以直接访问网卡芯片RCR达到设置混听模式。
所谓 条条大路通香港,就是这个道理:)没有绝对的
本机和本机Socket通信会走网卡吗
先说结论:不走网卡,不走物理设备,但是走虚拟设备,loopback device环回(本地回环).
本机的报文的路径是这样的:应用层-> socket接口 -> 传输层(tcp/udp报文) -> 网络层 -> back to 传输层 -> backto socket接口 -.> 传回应用程序在网络层,会在路由表查询路由,路由表(软件路由,真正的转发需要依靠硬件路由,这里路由表包括快速转发表和FIB表)初始化时会保存主机路由(host route,or 环回路由), 查询(先匹配mask,再匹配ip,localhost路由在路由表最顶端,最优先查到)后发现不用转发就不用走中断,不用发送给链接层了,不用发送给网络设备(网卡)。像网卡发送接收报文一样,走相同的接收流程,只不过net device是loopback device,最后发送回应用程序。这一套流程当然和转发和接收外网报文一样,都要经过内核协议栈的处理,不同的是本机地址不用挂net device.
网卡,交换机,网桥,路由器,网关工作在OSI模型哪一层
网桥:工作在数据链路层,在不同或相同类型的LAN之间存储并转发数据帧,必要时进行链路层上的协议转换。可连接两个或多个网络,在其中传送信息包。
交换机:工作在数据链路层,原理等同于多端口网桥。作用是连接数个相同网段的不同主机,减少网内冲突,隔离冲突域。利用存储转发和过滤技术来从物理上分割网段
路由器:工作在网络层,在不同的网络间存储并转发分组。可在异种网络之间(即不同类型的局域网互连,局域网与广域网,广域网与广域网)传输数据并进行路径选择,使用专门的软件协议从逻辑上对整个网络进行划分。
网关:对高层协议(包括传输层及更高层次)进行转换的网间连接器。允许使用不兼容的协议,比如SPX/IPX和TCP/IP的系统和网络互连。因为协议转换是网关最重要的功能,所以答案是工作在传输层及以上层次。
网卡:在物理层上网卡主要是完成物理接口的连接,电信号的传送以及将数据分解为适当大小的数据包之后向网络上发送的功能. 数据链路层功能包括链路建立和拆除,帧定界同步顺序差错控制这些。大多认为主要工作在物理层。
网卡核心电器元件
网卡的组成:
主芯片:网卡的主控制芯片是网卡的核心元件,一块网卡性能的好坏和功能的强弱多寡,主要就是看这块芯片的质量
BOOTROM槽:BOOTROM 插座也就是常说的无盘启动ROM 接口,其是用来通过远程启动服务构造无盘工作站的
数据泵:作用一是传输数据;二是隔离网线连接的不同网络设备间的不同电平,还能对设备起到一定的防雷保护作用
晶振即石英振荡器:提供基准频率
MAC 控制器&PHY
以太网卡中数据链路层的芯片一般简称之为 MAC 控制器,物理层的芯片我们简称之为PHY。即使把它们做到同一块芯片,但是MAC 和PHY 的机制还是单独存在的,只是外观的表现形式是一颗单芯片。
数据链路层MAC 控制器
以太网数据链路层其实包含MAC(介质访问控制)子层和LLC(逻辑链路控制)子层。
一块以太网卡MAC 芯片的作用不但要实现MAC 子层和LLC 子层的功能,还要提供符合规范的PCI 界面以实现和主机的数据交换。
MAC 从PCI 总线收到IP 数据包(或者其他网络层协议的数据包)后,将之拆分并重新打包成最大1518Byte,最小64Byte 的帧。这个帧里面包括了目标MAC 地址、自己的源MAC 地址和数据包里面的协议类型(比如IP 数据包的类型用80 表示)。最后还有一个DWORD(4Byte)的CRC 码。
可是目标的 MAC 地址是哪里来的呢?
这牵扯到一个ARP 协议(介乎于网络层和数据链路层的一个协议)。第一次传送某个目的IP 地址的数据的时候,先会发出一个ARP 包,其MAC 的目标地址是广播地址,里面说到:"谁是xxx.xxx.xxx.xxx 这个IP 地址的主人?"因为是广播包,所有这个局域网的主机都收到了这个ARP 请求。收到请求的主机将这个IP地址和自己的相比较,如果不相同就不予理会,如果相同就发出ARP 响应包。这个IP 地址的主机收到这个ARP 请求包后回复的ARP 响应里说到:"我是这个IP 地址的主人"。这个包里面就包括了他的MAC 地址。以后的给这个IP 地址的帧的目标MAC 地址就被确定了。(其它的协议如IPX/SPX 也有相应的协议完成这些操作。)IP 地址和MAC 地址之间的关联关系保存在主机系统里面,叫做ARP 表,由驱动程序和操作系统完成。在Microsoft 的系统里面可以用 arp -a 的命令查看ARP 表。
IP 协议定义了一套自己的地址规则,称为 IP 地址。它实现了路由功能,允许某个局域网的 A 主机,向另一个局域网的 B 主机发送消息。
路由的原理很简单。市场上所有的路由器,背后都有很多网口,要接入多根网线。路由器内部有一张路由表,规定了 A 段 IP 地址走出口一,B 段地址走出口二,......通过这套"指路牌",实现了数据包的转发。
IP 协议只是一个地址协议,并不保证数据包的完整。如果路由器丢包(比如缓存满了,新进来的数据包就会丢失),就需要发现丢了哪一个包,以及如何重新发送这个包。这就要依靠 TCP 协议。
简单说,TCP 协议的作用是,保证数据通信的完整性和可靠性,防止丢包。
收到数据帧的时候也是一样,做完CRC 以后,如果没有CRC 效验错误,就把帧头去掉,把数据包拿出来通过标准的借口传递给驱动和上层的协议客栈,最终正确的达到我们的应用程序。还有一些控制帧,例如流控帧也需 要MAC 直接识别并执行相应的行为。以太网MAC芯片的一端接计算机PCI 总线,另外一端就接到PHY 芯片上。以太网的物理层又包括MII/GMII(介质独立接口)子层、PCS(物理编码子层)、PMA(物理介质附加)子层、PMD(物理介质相关)子层、MDI 子层。而PHY 芯片是实现物理层的重要功能器件之一,实现了前面物理层的所有的子层的功能。
物理层PHY
PHY 在发送数据的时候,收到MAC 过来的数据(对PHY 来说,没有帧的概念,对它来说,都是数据而不管什么地址,数据还是CRC),每4bit 就增加1bit 的检错码,然后把并行数据转化为串行流数据,再按照物理层的编码规则(10Based-T 的NRZ 编码或100based-T的曼彻斯特编码)把数据编码,再变为模拟信号把数据送出去。(注:关于网线上数据是数字的还是模拟的比较不容易理解清楚。最后我再说)收数据时的流程反之。发送数据时,PHY 还有个重要的功能就是实现CSMA/CD 的部分功能,它可以检测到网络上是否有数据在传送。网卡首先侦听介质上是否有载波(载波由电压指示),如果有,则认为其他站点正在传送信息,继续侦听介质。一旦通信介质在一定时间段内(称为帧间缝隙IFG= 9.6 微秒)是安静的,即没有被其他站点占用,则开始进行帧数据发送,同时继续侦听通信介质,以检测冲突。在发送数据期间,如果检测到冲突,则立即停止该次发送,并向介质发送一个“阻塞”信号,告知其他站点已经发生冲突,从而丢弃那些可能一直在接收的受到损坏的帧数据,并等待一段随机时间(CSMA/CD 确定等待时间的算法是二进制指数退避算法)。在等待一段随机时间后,再进行新的发送。如果重传多次后(大于16 次)仍发生冲突,就放弃发送。接收时,网卡浏览介质上传输的每个帧,如果其长度小于64 字节,则认为是冲突碎片。如果接收到的帧不是冲突碎片且目的地址是本地地址,则对帧进行完整性校验,如果帧长度大于1518 字节(称为超长帧,可能由错误的LAN 驱动程序或干扰造成)或未能通过CRC校验,则认为该帧发生了畸变。通过校验的帧被认为是有效的,网卡将它接收下来进行本地处理许多网友在接入 Internt 宽带时,喜欢使用"抢线"强的网卡,就是因为不同的PHY 碰撞后计算随机时间的方法设计上不同,使得有些网卡比较"占便宜"。不过,抢线只对广播域的网络而言的,对于交换网络和ADSL 这样点到点连接到局端设备的接入方式没什么意义。而且"抢线"也只是相对而言的,不会有质的变化。
关于网络间的冲突
现在交换机的普及使得交换网络的普及,使得冲突域网络少了很多,极大地提高了网络的带宽。但是如果用HUB,或者共享带宽接入Internet 的时候还是属于冲突域网络,有冲突碰撞的。交换机和HUB 最大的区别就是:一个是构建点到点网络的局域网交换设备,一个是构建冲突域网络的局域网互连设备。我们的 PHY 还提供了和对端设备连接的重要功能并通过LED 灯显示出自己目前的连接的状态和工作状态让我们知道。当我们给网卡接入网线的时候,PHY 不断发出的脉冲信号检测到对端有设备,它们通过标准的"语言"交流,互相协商并却定连接速度、双工模式、是否采用流控等。通常情况下,协商的结果是两个设备中能同时支持的最大速度和最好的双工模式。这个技术被称为Auto Negotiation 或者NWAY,它们是一个意思--自动协商。
PHY 的输出部分
现在来了解 PHY 的输出后面部分。一颗CMOS 制程的芯片工作的时候产生的信号电平总是大于0V 的(这取决于芯片的制程和设计需求),但是这样的信号送到100 米甚至更长的地方会有很大的直流分量的损失。而且如果外部网现直接和芯片相连的话,电磁感应(打雷)和静电,很容易造成芯片的损坏。再就是设备接地方法不同,电网环境不同会导致双方的0V 电平不一致,这样信号从A传到B,由于A 设备的0V 电平和B 点的0V 电平不一样,这样会导致很大的电流从电势高的设备流向电势低的设备。我们如何解决这个问题呢?这时就出现了 Transformer(隔离变压器)这个器件。它把PHY 送出来的差分信号用差模耦合的线圈耦合滤波以增强信号,并且通过电磁场的转换耦合到连接网线的另外一端。这样不但使网线和PHY 之间没有物理上的连接而换传递了信号,隔断了信号中的直流分量,还可以在不同0V 电平的设备中传送数据。隔离变压器本身就是设计为耐 2KV~3KV 的电压的。也起到了防雷感应(我个人认为这里用防雷击不合适)保护的作用。有些朋友的网络设备在雷雨天气时容易被烧坏,大都是PCB 设计不合理造成的,而且大都烧毁了设备的接口,很少有芯片被烧毁的,就是隔离变压器起到了保护作用。
关于传输介质
隔离变压器本身是个被动元件,只是把PHY 的信号耦合了到网线上,并没有起到功率放大的作用。那么一张网卡信号的传输的最长距离是谁决定的呢?一张网卡的传输最大距离和与对端设备连接的兼容性主要是 PHY 决定的。但是可以将信号送的超过100 米的PHY 其输出的功率也比较大,更容易产生EMI 的问题。这时候就需要合适的Transformer 与之配合。作PHY 的老大公司Marvell 的PHY,常常可以传送180~200米的距离,远远超过IEEE 的100 米的标准。RJ-45 的接头实现了网卡和网线的连接。它里面有8 个铜片可以和网线中的4 对双绞(8根)线对应连接。其中100M 的网络中1、2 是传送数据的,3、6 是接收数据的。1、2 之间
是一对差分信号,也就是说它们的波形一样,但是相位相差180 度,同一时刻的电压幅度互为正负。这样的信号可以传递的更远,抗干扰能力强。同样的,3、6 也一样是差分信号。网线中的 8 根线,每两根扭在一起成为一对。我们制作网线的时候,一定要注意要让1、2 在其中的一对,3、6 在一对。否则长距离情况下使用这根网线的时候会导致无法连接或连接很不稳定。现在新的 PHY 支持AUTO MDI-X 功能(也需要Transformer 支持)。它可以实现RJ-45接口的1、2 上的传送信号线和3、6 上的接收信号线的功能自动互相交换。有的PHY 甚至支持一对线中的正信号和负信号的功能自动交换。这样我们就不必为了到底连接某个设备需要使用直通网线还是交叉网线而费心了。这项技术已经被广泛的应用在交换机和SOHO 路由器上。在 1000Basd-T 网络中,其中最普遍的一种传输方式是使用网线中所有的4 对双绞线,其中增加了4、5 和7、8 来共同传送接收数据。由于1000Based-T 网络的规范包含了AUTOMDI-X 功能,因此不能严格确定它们的传出或接收的关系,要看双方的具体的协商结果。
PHY 和MAC 之间如何进行沟通
下面继续让我们来关心一下 PHY 和MAC 之间是如何传送数据和相互沟通的。通过IEEE 定义的标准的MII/GigaMII(Media Independed Interfade,介质独立界面)界面连接MAC和PHY。这个界面是IEEE 定义的。MII 界面传递了网络的所有数据和数据的控制。而 MAC 对PHY 的工作状态的确定和对PHY 的控制则是使用SMI(Serial ManagementInterface)界面通过读写PHY 的寄存器来完成的。PHY 里面的部分寄存器也是IEEE 定义的,这样PHY 把自己的目前的状态反映到寄存器里面,MAC 通过SMI 总线不断的读取PHY 的状态寄存器以得知目前PHY 的状态,例如连接速度,双工的能力等。当然也可以通过SMI设置PHY 的寄存器达到控制的目的,例如流控的打开关闭,自协商模式还是强制模式等。我们看到了,不论是物理连接的 MII 界面和SMI 总线还是PHY 的状态寄存器和控制寄存器都是有IEEE 的规范的,因此不同公司的MAC 和PHY 一样可以协调工作。当然为了配合不同公司的PHY 的自己特有的一些功能,驱动需要做相应的修改。
网卡的供电
最后就是电源部分了。大多数网卡现在都使用 3.3V 或更低的电压。有的是双电压的。因此需要电源转换电路。而且网卡为了实现 Wake on line 功能,必须保证全部的PHY 和MAC 的极少一部分始终处于有电的状态,这需要把主板上的5V Standby 电压转换为PHY 工作电压的电路。在主机开机后,PHY 的工作电压应该被从5V 转出来的电压替代以节省5V Standby 的消耗。(许多劣质网卡没有这么做)。有 Wake on line 功能的网卡一般还有一个WOL 的接口。那是因为PCI2.1 以前没有PCI设备唤醒主机的功能,所以需要着一根线通过主板上的WOL 的接口连到南桥里面以实现WOL 的功能。新的主板合网卡一般支持 PCI2.2/2.3,扩展了PME#信号功能,不需要那个接口而通过PCI 总线就可以实现唤醒功能。
电脑之间通过网线传送的信号是交流高频信号,电压不超过3伏,带不动任何负载。
需要带负载的POE电压是48V。RJ45的接口 最大持续工作电压是8V
电话通过网线传送的信号直流48—50V,摘机状态下是直流6-12V,振铃信号是交流90V 100m以太网的数据发送和接收时传送的信号是交流高频信号,电压不超过3伏。
电话线上的电压平时是直流48V,而且是高内阻的电源,手碰上绝对安全。但如果动手时正好有电话打入,此时振铃电压是75V交流电压,会有很强的麻手感觉,但没有危险。为了保险,可以在动手时将电话机外线临时短路,电压为0,也不会再有电话能打入。装好以后将短路线拆除。
TCP 数据包的组装
TCP 数据包的组装是操作系统完成的,应用程序不会直接处理 TCP 数据包。对于应用程序来说,不用关心数据通信的细节。除非线路异常,收到的总是完整的数据。应用程序需要的数据放在 TCP 数据包里面,有自己的格式(比如 HTTP 协议)。
TCP 并没有提供任何机制,表示原始文件的大小,这由应用层的协议来规定。比如,HTTP 协议就有一个头信息Content-Length,表示信息体的大小。对于操作系统来说,就是持续地接收 TCP 数据包,将它们按照顺序组装好,一个包都不少。
操作系统不会去处理 TCP 数据包里面的数据。一旦组装好 TCP 数据包,就把它们转交给应用程序。TCP 数据包里面有一个端口(port)参数,就是用来指定转交给监听该端口的应用程序。
应用程序收到组装好的原始数据,以浏览器为例,就会根据 HTTP 协议的 Content-Length 字段正确读出一段段的数据。这也意味着,一次 TCP 通信可以包括多个 HTTP 通信。
为什么多 TCP 连接分块下载比单连接下载快?
具体 查看:https://www.zhihu.com/question/21813579/answer/19402704
使用迅雷等下载客户端软件,通常会设置5-10个下载进程,并发下载。
最后附上经典:
英文版地址:http://pcvr.nl/tcpip/
参考文章:
网络编程懒人入门(三):快速理解TCP协议一篇就够 http://www.52im.net/thread-1107-1-1.html
Maximum Segment Size,TCP一次传输发送的最大数据段长度
转载本站文章《从网卡发送数据再谈TCP/IP协议—网络传输速度计算-网卡构造》,
请注明出处:https://www.zhoulujun.cn/html/theory/ComputerScienceTechnology/network/2016_0810_7878.html
延伸阅读:
- 浏览器与APP复制/剪切后粘板板内容设置—复制内容加版权
- HTTP协议及其POST与GET操作差异 & C#中如何使用POST、GET等
- 分析HTTP,TCP的长连接和短连接以及sock
- HTTP Keep-Alive模式,客户端如何判断服务器的数据已经发生完成
- 说说Angular $http service中的缓存
- intellij java http 中文输出乱码,itellij乱码问题汇总
- angularjs用$http发起ajax请求,提交JSON数据post后台无法接收
- http1.0 与 http1.1的区别
- 再谈HTTP2性能提升之背后原理—从http1到HTTP2的历史解剖
- Nginx实践配置HTTP2.0