Linux C高级编程——网络编程之以太网

Posted gccbuaa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux C高级编程——网络编程之以太网相关的知识,希望对你有一定的参考价值。

Linux网络编程——以太网


宗旨:技术的学习是有限的,分享的精神是无限的。


1、以太网帧格式

技术分享

        源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固化的。用ifconfig命令查看,“ 硬件地址 00:0c:29:cf:7e:1a  。协议字段有三种值,分别相应IP、 ARP、 RARP。帧末尾是CRC校验码

        ARPRARP数据包的长度不够46字节。要在后面补填充位。

最大值1500称为以太网的最大传输单元( MTU),不同的网络类型有不同的MTU,假设一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了。则须要对数据包进行分片( fragmentation

ifconfig查看“ MTU:1500”。

MTU这个概念指数据帧中有效载荷的最大长度,不包含帧首部的长度。


2数据报格式

        在网络通讯时,源主机的应用程序知道目的主机的IP地址和port号。却不知道目的主机的硬件地址,而数据包首先是被网卡接收到再去处理上层协议的,假设接收到的数据包的硬件地址与本机不符,则直接丢弃。因此在通讯前必须获得目的主机的硬件地址。 ARP协议就起到这个作用。源主机发出ARP请求,询问“IP地址是192.168.0.1的主机的硬件地址是多少,并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播),目的主机接收到广播的ARP请求,发现当中的IP地址与本机相符。则发送一个ARP应答数据包给源主机。将自己的硬件地址填写在应答包中。

        每台主机都维护一个ARP缓存表,能够用arp -a命令查看。缓存表中的表项有过期时间(一般为20分钟),假设20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址。

ARP数据报格式:

技术分享

        注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次。对于链路层为以太网的情况是多余的,但假设链路层是其他类型的网络则有可能是必要的。硬件类型指链路层网络类型。1为以太网,协议类型指要转换的地址类型,0x0800IP地址,后面两个地址长度对于以太网地址和IP地址分别为64(字节)。op字段为1表示ARP请求,op字段为2表示ARP应答。

比如请求帧:

以太网首部( 14字节)

0000: ff ff ff ff ff ff 00 05 5d 61 58 a8 08 06

ARP帧( 28字节)

0000: 00 01

0010: 08 00 06 04 00 01 00 05 5d 61 58 a8 c0 a8 00 37

0020: 00 00 00 00 00 00 c0 a8 00 0218

填充位( 字节)

0020: 00 77 31 d2 50 10

0030: fd 78 41 d3 00 00 00 00 00 00 00 00

以太网首部:目的主机採用广播地址,源主机的MAC地址是00:05:5d:61:58:a8。上层协议类型0x0806表示ARP

ARP帧:硬件类型0x0001表示以太网。协议类型0x0800表示IP协议,硬件地址(MAC地址)长度为6,协议地址(IP地址)长度为4op0x0001表示请求目的主机的MAC地址。源主机MAC地址为00:05:5d:61:58:a8,源主机IP地址为c0 a8 00 37192.168.0.55),目的主机MAC地址全0待填写。目的主机IP地址为c0 a8 00 02192.168.0.2)。

因为以太网规定最小数据长度为46字节。 ARP帧长度仅仅有28字节。因此有18字节填充位,填充位的内容未定义,与详细实现相关。


应答帧例如以下:

以太网首部

0000: 00 05 5d 61 58 a8 00 05 5d a1 b8 40 08 06

ARP0000: 00 01

0010: 08 00 06 04 00 02 00 05 5d a1 b8 40 c0 a8 00 02

0020: 00 05 5d 61 58 a8 c0 a8 00 37

填充位0020: 00 77 31 d2 50 100030: fd 78 41 d3 00 00 00 00 00 00 00 00

以太网首部:目的主机的MAC地址是00:05:5d:61:58:a8,源主机的MAC地址是00:05:5d:a1:b8:40。上层协议类型0x0806表示ARP

ARP帧:硬件类型0x0001表示以太网,协议类型0x0800表示IP协议。硬件地址( MAC地址)长度为6,协议地址( IP地址)长度为4op0x0002表示应答,源主机MAC地址为00:05:5d:a1:b8:40,源主机IP地址为c0 a8 00 02( 192.168.0.2)。目的主机MAC地址为00:05:5d:61:58:a8。目的主机IP地址为c0 a8 00 37( 192.168.0.55)。


3数据报格式

技术分享

        IP数据报的首部长度和数据长度都是可变长的。但总是4字节的整数倍。对于IPv44位版本号字段是44位首部长度的数值是以4字节为单位的。最小值为5。也就是说首部长度最小是4x5=20字节,也就是不带不论什么选项的IP首部,4位能表示的最大值是15,也就是说首部长度最大是60字节。8TOS字段有3个位用来指定IP数据报的优先级(眼下已经废弃不用),还有4个位表示可选的服务类型(最小延迟、最大呑吐量、最大可靠性、最小成本),另一个位总是0

总长度是整个数据报(包含IP首部和IPpayload)的字节数。每传一个IP数据报,16位的标识加1,可用于分片和又一次组装数据报。3位标志和13位片偏移用于分片。 TTLTime to live)是这样用的:源主机为数据包设定一个生存时间,比方64,每过一个路由器就把该值减1。假设减到0就表示路由已经太长了仍然找不到目的主机的网络,就丢弃该包,因此这个生存时间的单位不是秒,而是跳(hop)。协议字段指示上层协议是TCPUDPICMP还是IGMP。然后是校验和,仅仅校验IP首部,数据的校验由更高层协议负责。IPv4IP地址长度为32位。


4、IP地址

        IPv4IP地址长度为4字节,通常採用点分十进制表示法(dotted decimal representation)比如0xc0a80002表示为192.168.0.2。 Internet被各种路由器和网关设备分隔成非常多网段。为了标识不同的网段,须要把32位的IP地址划分成网络号和主机号两部分。网络号同样的各主机位于同一网段,相互间能够直接通信,网络号不同的主机之间通信则须要通过路由器转发。

技术分享

A类 0.0.0.0127.255.255.255

B类 128.0.0.0191.255.255.255

C类 192.0.0.0223.255.255.255

D类 224.0.0.0239.255.255.255

E类 240.0.0.0247.255.255.255

        一个A类网络可容纳的地址数量最大,一个B类网络的地址数量是65536。一个C类网络的地址数量是256。 D类地址用作多播地址。 E类地址保留未用。

        网络号和主机号的划分须要用一个额外的子网掩码(subnet mask)来表示,而不能由IP地址本身的数值决定,也就是说,网络号和主机号的划分与这个IP地址是A类、 B类还是C类无关,因此称为Classless的。

这样,多个子网就能够汇总(summarize)成一个Internet上的网络,比如,有8个网站都申请了C类网络,本来网络号是24位的,可是这8个网站通过同一个ISPInternet serviceprovider)连到Internet上,它们网络号的高21位是同样的,仅仅有低三位不同,这8个网站就能够汇总,在Internet上仅仅须要一个路由表项,数据包通过Internet上的路由器到达ISP,然后在ISP这边再通过次级的路由器选路到某个网站。

比如:子网1

技术分享

子网2

技术分享

        IP地址与子网掩码做与运算能够得到网络号。主机号从全0到全1就是子网的地址范围。IP地址和子网掩码另一种更简洁的表示方法。比如140.252.20.68/24。表示IP地址为140.252.20.68。子网掩码的高24位是1。也就是255.255.255.0

        假设一个组织内部组建局域网, IP地址仅仅用于局域网内的通信,而不直接连到Internet上,理论上使用随意的IP地址都能够。可是RFC 1918规定了用于组建局域网的私有IP地址,这些地址不会出如今Internet上,例如以下表所看到的。

10.*,前8位是网络号,共16,777,216个地址

172.16.*172.31.*。前12位是网络号。共1,048,576个地址

192.168.*,前16位是网络号。共65,536个地址

        127.*IP地址用于本机环回(loop back)測试,一般是127.0.0.1loopback是系统中一种特殊的网络设备。假设发送数据包的目的地址是环回地址,或者与本机其他网络设备的IP地址同样,则数据包不会发送到网络介质上,而是通过环回设备再发回给上层协议和应用程序。主要用于測试。








以上是关于Linux C高级编程——网络编程之以太网的主要内容,如果未能解决你的问题,请参考以下文章

Linux C语言高级编程之使用消息队列实现进程间通信!重点内容!!!

Linux C与C++一线开发实践之六 多线程高级编程

Linux C与C++一线开发实践之六 多线程高级编程

Linux C高级编程——网络编程

当高级语言编译为低级语言(例如 C)时,是不是有一个术语?

Linux C高级编程——网络编程