在《在深谈TCP/IP三步握手&四步挥手原理及衍生问题—长文解剖IP》里面提到html
单个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网络 是 瞎子点灯?socket
注:tcp
在链路层,由以太网的物理特性决定了数据帧的长度为(46+18)-(1500+18),其中的18是数据帧的头和尾,也就是说数据帧的内容最大为1500(不包括帧头和帧尾),即MTU(Maximum Transmission Unit)为1500; oop
在网络层,由于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倍。
这个迷惑一直困扰着我。百思不得骑姐
而后开始
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达到设置混听模式。
所谓 条条大路通香港,就是这个道理:)没有绝对的
先说结论:不走网卡,不走物理设备,可是走虚拟设备,loopback device环回(本地回环).
本机的报文的路径是这样的:应用层-> socket接口 -> 传输层(tcp/udp报文) -> 网络层 -> back to 传输层 -> backto socket接口 -.> 传回应用程序在网络层,会在路由表查询路由,路由表(软件路由,真正的转发须要依靠硬件路由,这里路由表包括快速转发表和FIB表)初始化时会保存主机路由(host route,or 环回路由), 查询(先匹配mask,再匹配ip,localhost路由在路由表最顶端,最优先查到)后发现不用转发就不用走中断,不用发送给连接层了,不用发送给网络设备(网卡)。像网卡发送接收报文同样,走相同的接收流程,只不过net device是loopback device,最后发送回应用程序。这一套流程固然和转发和接收外网报文同样,都要通过内核协议栈的处理,不一样的是本机地址不用挂net device.
网桥:工做在数据链路层,在不一样或相同类型的LAN之间存储并转发数据帧,必要时进行链路层上的协议转换。可链接两个或多个网络,在其中传送信息包。
交换机:工做在数据链路层,原理等同于多端口网桥。做用是链接数个相同网段的不一样主机,减小网内冲突,隔离冲突域。利用存储转发和过滤技术来从物理上分割网段
路由器:工做在网络层,在不一样的网络间存储并转发分组。可在异种网络之间(即不一样类型的局域网互连,局域网与广域网,广域网与广域网)传输数据并进行路径选择,使用专门的软件协议从逻辑上对整个网络进行划分。
网关:对高层协议(包括传输层及更高层次)进行转换的网间链接器。容许使用不兼容的协议,好比SPX/IPX和TCP/IP的系统和网络互连。由于协议转换是网关最重要的功能,因此答案是工做在传输层及以上层次。
网卡:在物理层上网卡主要是完成物理接口的链接,电信号的传送以及将数据分解为适当大小的数据包以后向网络上发送的功能. 数据链路层功能包括链路创建和拆除,帧定界同步顺序差错控制这些。大多认为主要工做在物理层。
主芯片:网卡的主控制芯片是网卡的核心元件,一块网卡性能的好坏和功能的强弱多寡,主要就是看这块芯片的质量
BOOTROM槽:BOOTROM 插座也就是常说的无盘启动ROM 接口,其是用来经过远程启动服务构造无盘工做站的
数据泵:做用一是传输数据;二是隔离网线链接的不一样网络设备间的不一样电平,还能对设备起到必定的防雷保护做用
晶振即石英振荡器:提供基准频率
以太网卡中数据链路层的芯片通常简称之为 MAC 控制器,物理层的芯片咱们简称之为PHY。即便把它们作到同一块芯片,可是MAC 和PHY 的机制仍是单独存在的,只是外观的表现形式是一颗单芯片。
以太网数据链路层其实包含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 表。
收到数据帧的时候也是同样,作完CRC 之后,若是没有CRC 效验错误,就把帧头去掉,把数据包拿出来经过标准的借口传递给驱动和上层的协议客栈,最终正确的达到咱们的应用程序。还有一些控制帧,例如流控帧也需 要MAC 直接识别并执行相应的行为。以太网MAC芯片的一端接计算机PCI 总线,另一端就接到PHY 芯片上。以太网的物理层又包括MII/GMII(介质独立接口)子层、PCS(物理编码子层)、PMA(物理介质附加)子层、PMD(物理介质相关)子层、MDI 子层。而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 的输出后面部分。一颗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 的网络中一、2 是传送数据的,三、6 是接收数据的。一、2 之间
是一对差分信号,也就是说它们的波形同样,可是相位相差180 度,同一时刻的电压幅度互为正负。这样的信号能够传递的更远,抗干扰能力强。一样的,三、6 也同样是差分信号。网线中的 8 根线,每两根扭在一块儿成为一对。咱们制做网线的时候,必定要注意要让一、2 在其中的一对,三、6 在一对。不然长距离状况下使用这根网线的时候会致使没法链接或链接很不稳定。如今新的 PHY 支持AUTO MDI-X 功能(也须要Transformer 支持)。它能够实现RJ-45接口的一、2 上的传送信号线和三、6 上的接收信号线的功能自动互相交换。有的PHY 甚至支持一对线中的正信号和负信号的功能自动交换。这样咱们就没必要为了到底链接某个设备须要使用直通网线仍是交叉网线而费心了。这项技术已经被普遍的应用在交换机和SOHO 路由器上。在 1000Basd-T 网络中,其中最广泛的一种传输方式是使用网线中全部的4 对双绞线,其中增长了四、5 和七、8 来共同传送接收数据。因为1000Based-T 网络的规范包含了AUTOMDI-X 功能,所以不能严格肯定它们的传出或接收的关系,要看双方的具体的协商结果。
下面继续让咱们来关心一下 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,也不会再有电话能打入。装好之后将短路线拆除。
最后附上经典:
英文版地址:http://pcvr.nl/tcpip/
参考文章:
Maximum Segment Size,TCP一次传输发送的最大数据段长度
本文来自:从网卡发送数据再谈TCP/IP协议-网络传输速度计算-网卡构造 - Network - 周陆军的我的网站
————总结性长文,非原创,若有不妥之处,请告知,多谢