【读书笔记】Linux高性能服务器编程(第一篇 第一章 1.2-1.6)

1.2 封装
封装过程如图:


经过TCP封装后的数据成为TCP报文段,简称TCP段。
TCP协议为通信双方维持一个连接,并且在内核中存储相关数据,
这部分数据中的TCP头部信息和TCP内核缓冲区(发送缓冲区或接受缓冲区)数据一起构成了TCP报文段。
 
当发送端应用程序使用send(write)函数向一个TCP连接写入数据时,内核中的TCP模块首先把这些数据复制到与该连接对应的TCP内核发送缓冲区中,然后TCP模块调用IP模块提供的服务,传递的参数包括TCP头部信息和TCP发送缓冲区中的数据,即TCP报文段。


经过UDP封装后的数据成为UDP数据报,UDP与TCP不同的是,UDP无需为应用层数据保存副本,因为它提供的服务是不可靠的。当一个UDP数据报成功发送后,UDP内核缓冲区中的该数据报就被丢弃了;如果发送失败,应用程序打算重发这个数据报,则应用程序需要重新从用户空间将该数据报拷贝到UDP内核发送缓冲区中。
经过IP封装后的数据成为IP数据报,IP数据报也包括头部信息和数据部分,其中的数据部分就是一个TCP报文段,UDP报文段或者ICMP报文段。
经过数据链路层封装后的数据称为帧(frame),传输媒介不同,帧的类型也不同,例如:以太网上传输的是以太网帧,而令牌环网络上传输的则是令牌环帧。

以太网帧的封装格式如图:



以太网使用6字节的目的物理地址和6字节的源物理地址来表示通信的双方,4字节CRC字段对帧的其他部分提供循环冗余校验。
帧的最大传输单元(Max Transmit Unit ,MTU),以太网帧的MTU是1500字节(MTU的长度是指:IP头部和数据报部分的总和),正因为如此,过长的IP数据报可能需要被分片(fragment)传输。

帧是最终在物理网络上传送的字节序列,至此封装过程完成。


1.3 分用
当帧到达目的主机时,将沿着协议栈(Protocol Stack)(是指网络中各层协议的总和)自底向上依次传递。各层协议依次处理帧中本层负责的头部数据,以获取所需的信息,并最终将处理后的帧交给目标应用程序。这个过程称为分用。分用是依靠头部信息中的类型字段实现的。

以太网的分用过程:


因为IP协议,ARP协议和RARP协议都使用帧传输数据,所以帧的头部需要提供某个字段(取决于帧的类型)来区分。
同理,因为ICMP,TCP,UDP都使用IP协议,所以IP数据报的头部采用16位的协议字段来区分它们。
TCP报文段,UDP报文段则通过其头部中的16位端口号字段来区分上层应用程序。例如:DNS对应的端口号是53,HTTP对应的端口号是80。各层协议使用的端口号可在/etc/services文件中找到。
ARP协议工作原理:
ARP协议能够实现任意网络层地址到任意物理地址的转换,
工作原理是:主机向自己所在的网络广播一个ARP请求,该请求包含目标机器的网络地址,此网络上的其他机器都将收到这个请求,但只有被请求的目标机器会回应一个ARP应答,其中包含自己的物理地址。

以太网ARP请求/应答报文的格式如图:



硬件类型字段定义物理地址的类型,它的值为1表示MAC地址。
协议类型字段表示要映射的协议地址类型,它的值为0x800,表示IP地址。
硬件地址长度字段和协议地址长度字段,单位是字节,对MAX地址来说其长度为6;对IP(v4)地址来说其长度为4.
操作字段支出4种操作类型:ARP请求(值为1),ARP应答(值为2),RARP请求(值为3),RARP应答(值为4)。
最后4个字段指定通信双方的以太网地址和IP地址。发送端填充除目的端以太网地址外的其他3个字段,以搭建ARP请求并发送之。
接收端发现该请求的目的端IP地址是自己,就把自己的以太网地址填进去,然后交换两个目的端地址和两个发送端地址,以构建ARP应答并返回(操作字段设置为2)。
通常ARP维护一个高速缓存,其中包含经常访问或最近访问的机器的IP地址到物理地址的映射,这样避免了重复的ARP请求,提高了发送数据包的速度。
Linux下可以用arp命令查看和修改ARP高速缓存。
 

ARP通信过程:



注意:ARP请求和应答是从以太网驱动程序发出的,而并非像图中描述的那样从ARP模块直接发送到以太网上,所以用虚线表示,主要是为了体现携带ARP数据的以太网帧和携带IP数据报的区别。
路由器也会受到以太网帧1,因为该帧是广播帧,不过路由器不回应其中的ARP请求(没有被请求回应)。
DNS工作原理:
DNS是一套分布式的域名服务系统,每个DNS服务器上存放着大量的机器名和IP地址的映射,并且是动态更新的。
众多网络客户端程序都使用DNS协议来向DNS服务器查询目标主机的IP地址。

DNS查询/应答报文如下:



16位标识字段用于标记一对DNS查询和应答,以此区分一个DNS应答是哪个DNS查询的回应。
16位标志字段用于协商具体的通信方式和反馈通信状态。

DNS报文头部的16位标志字段的细节如图:



QR,查询/应答标志,0代表查询报文,1代表应答报文。
opcode,定义查询和应答的类型,0表示标准查询,1表示反向查询(由IP地址获得主机域名),2表示请求服务器状态。
AA,授权应答标志,仅由应答报文使用。1表示域名服务器是授权服务器。
TC,截断标志,仅当DNS报文使用UDP服务时使用。1表示截断
RD,递归查询标志。1表示执行递归查询(),0表示迭代查询
RA,允许递归标志。仅由应答报文使用,1表示DNS服务器支持递归查询。

Zero,这3位未用,必须都设置为0。

rcode,4位返回码,表示应答的状态。常用值有0(无错误)和3(域名不存在)。

接下来的4个字段则分别支出DNS报文的最后4个字段的资源记录数目。对查询报文而言,它一般包含一个查询问题,而应答资源记录数,授权资源记录数和额外资源记录数则为0。应答报文的应答资源记录数则至少为1,而授权资源记录数和额外资源记录数可为0或非0。


接下来的4个字段则分别支出DNS报文的最后4个字段的资源记录数目。对查询报文而言,它一般包含一个查询问题,而应答资源记录数,授权资源记录数和额外资源记录数则为0。应答报文的应答资源记录数则至少为1,而授权资源记录数和额外资源记录数可为0或非0。

查询问题的格式如图:


查询名以一定的格式封装了要查询的主机域名。16位查询类型表示如何执行查询操作,常见的类型有如下几种:

类型A,值1,表示获取目标主机的IP地址。

类型CNAME,值5,表示获得目标主机的别名。

类型PTR,值12,表示反向查询。

16位查询类通常为1,表示获取因特网地址(IP地址)

应答字段,授权字段和额外信息字段都使用资源记录格式。

如图:


32位域名是该记录中与资源对应的名字,其格式和查询问题中的查询名字段相同。16位类型和16位类字段的含义也与DNS查询对应字段相同。

32位生存时间表示该查询记录结果可被本地客户端程序缓存多长时间,单位是秒。

16位资源数据长度字段和资源数据字段的内容取决于类型字段。对类型A而言,资源数据时32位的IPv4地址,而资源数据长度则为4(以字节为单位)。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值