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

Linux网络编程——以太网

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

1、以太网帧格式

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

ARP和RARP数据包的长度不够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为以太网,协议类型指要转换的地址类型,0x0800为IP地址,后面两个地址长度对于以太网地址和IP地址分别为6和4(字节)。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地址)长度为4,op为0x0001表示请求目的主机的MAC地址。源主机MAC地址为00:05:5d:61:58:a8,源主机IP地址为c0 a8 00 37(192.168.0.55),目的主机MAC地址全0待填写。目的主机IP地址为c0 a8 00 02(192.168.0.2)。

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

应答帧例如以下:

以太网首部

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

ARP帧0000: 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地址)长度为4,op为0x0002表示应答,源主机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字节的整数倍。对于IPv4,4位版本号字段是4。4位首部长度的数值是以4字节为单位的。最小值为5。也就是说首部长度最小是4x5=20字节,也就是不带不论什么选项的IP首部,4位能表示的最大值是15,也就是说首部长度最大是60字节。8位TOS字段有3个位用来指定IP数据报的优先级(眼下已经废弃不用),还有4个位表示可选的服务类型(最小延迟、最大呑吐量、最大可靠性、最小成本),另一个位总是0。

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

4、IP地址

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

A类 0.0.0.0到127.255.255.255

B类 128.0.0.0到191.255.255.255

C类 192.0.0.0到223.255.255.255

D类 224.0.0.0到239.255.255.255

E类 240.0.0.0到247.255.255.255

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

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

这样,多个子网就能够汇总(summarize)成一个Internet上的网络,比如,有8个网站都申请了C类网络,本来网络号是24位的,可是这8个网站通过同一个ISP(Internet 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.1。loopback是系统中一种特殊的网络设备。假设发送数据包的目的地址是环回地址,或者与本机其他网络设备的IP地址同样,则数据包不会发送到网络介质上,而是通过环回设备再发回给上层协议和应用程序。主要用于測试。

时间: 2024-10-10 19:42:56

Linux C高级编程——网络编程之以太网(2)的相关文章

Linux程序设计学习笔记----网络编程之网络数据包拆封包与字节顺序大小端

网络数据包的封包与拆包 过程如下: 将数据从一台计算机通过一定的路径发送到另一台计算机.应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation),如下图所示: 不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据包(packet),在链路层叫做帧(frame).数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理. 上图对应两台计算机在同一网段中的情况,

python高级之网络编程

python高级之网络编程 本节内容 网络通信概念 socket编程 socket模块一些方法 聊天socket实现 远程执行命令及上传文件 socketserver及其源码分析 1.网络通信概念 说到网络通信,那就不得不说TCP/IP协议簇的OSI七层模型了,这个东西当初在学校都学烂了...(PS:毕竟本人是网络工程专业出身...) 简单介绍下七层模型从底层到上层的顺序:物理层(定义物理设备的各项标准),数据链路层(mac地址等其他东西的封装),网络层(IP包头的的封装),传输层(TCP/UD

Linux网络编程------网络编程基础

Socket(套接字),类似文件描述符,三种 1.流式套接字(SOCK_STREAM):可以提供可靠的.面向连接的通讯流,它使用TCP协议.TCP保证了数据传输的正确性和顺序性. 2.数据报套接字(SOCK_DGRAM):定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠,无差错,它使用数据报协议(UDP). 3.原始套接字(SOCK_RAW):直接基于IP协议. 网络地址 struct sockaddr用于记录网络地址: struct sockaddr { u_s

Linux C高级编程——网络编程基础(1)

Linux高级编程--BSD socket的网络编程 宗旨:技术的学习是有限的,分享的精神是无限的. 一网络通信基础 TCP/IP协议簇基础:之所以称TCP/IP是一个协议簇,是由于TCP/IP包括TCP .IP.UDP.ICMP等多种协议.下图是OSI模型与TCP/IP模型的对照.TCP/IP将网络划分为4层模型:应用层.传输层.网络层和网络接口层(有些书籍将其分为5层,即网络接口层由链路层和物理层组成) (1)网络接口层:模型的基层.负责数据帧的发送已接收(帧是独立的网络信息传输单元).网络

Linux C高级编程——网络编程(1)

Linux高级编程--BSD socket的网络编程 宗旨:技术的学习是有限的,分享的精神的无限的. 一网络通信基础 TCP/IP协议簇基础:之所以称TCP/IP是一个协议簇,是因为TCP/IP包含TCP .IP.UDP.ICMP等多种协议.下图是OSI模型与TCP/IP模型的对比,TCP/IP将网络划分为4层模型:应用层.传输层.网络层和网络接口层(有些书籍将其分为5层,即网络接口层由链路层和物理层组成) (1)网络接口层:模型的基层,负责数据帧的发送已接收(帧是独立的网络信息传输单元).网络

Linux C高级编程——网络编程(3)

Linux网络编程(三)--TCP 宗旨:技术的学习是有限的,分享的精神是无限的. 1.TCP段格式 和UDP协议一样也有源端口号和目的端口号,通讯的双方由IP地址和端口号标识.32位序号.32位确认序号.窗口大小.4位首部长度和IP协议头类似,表示TCP协议头的长度,以4字节为单位,因此TCP协议头最长可以是4x15=60字节,如果没有选项字段, TCP协议头最短20字节.URG. ACK. PSH. RST. SYN. FIN是六个控制位,本节稍后将解释SYN. ACK. FIN. RST四

linux服务端的网络编程

常见的Linux服务端的开发模型有多进程.多线程和IO复用,即select.poll和epoll三种方式,其中现在广泛使用的IO模型主要epoll,关于该模型的性能相较于select和poll要好不少,本文也主要讨论该模型而忽略另外两种IO复用模型. 多线程相较于多进程开销比较小,但是要主要主线程往子线程传递数据的时候要注意变量互斥访问来保证线程安全. epoll模型在Linux2.6内核中引入的,改进了select中的一些明显设计上的缺点,具有更高的效率.主要体现在以下几个方面: 1. epo

linux网络编程--网络编程的基本函数介绍与使用【转】

本文转载自:http://blog.csdn.net/yusiguyuan/article/details/17538499 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有socket的基本函数,这些都是本文想介绍的.本文的主要内容如下: 1.网络中进程之间如何通信? 2.Socke

Linux下的socket网络编程

linux 网络编程是通过socket(套接字)接口实现,Socket是一种文件描述符,socket起源于UNIX,在Unix一切皆文件哲学的思想下,socket是一种"打开-读/写-关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件. socket 类型 常见的socket有3种类型如下.     (1)流式socket(SOCK_STREAM )     流式套接字提供可靠