Linux 高性能服务器编程——TCP/IP协议族

1 TCP/IP协议族体系结构

数据链路层:
    职责:实现网卡接口的网络驱动程序,一处理数据在物理媒介(如以太网、令牌环等)上的传输。
    常用协议:ARP协议(地址解析协议),RARP协议(逆地址解析协议)——实现了IP地址和机器物理地址之间的相互转换。
    寻址:使用物理地址(MAC地址)寻址一台机器。因此网络层必须先将目标机器的IP地址转化成其物理地址,才能使用数据链路层提供的服务。
网络层:
    职责:数据包的选路和转发。选路:确定两台主机之间的通信路径,对上层协议隐藏了网络拓扑的细节。
    协议:IP协议(因特网协议)——根据数据包的目的IP地址来决定如何投递它,使用逐跳的方式确定通信路径。
               ICMP协议(因特网控制报文协议)——IP协议的补充,用于检测网络连接。报文格式如下:
               
               8位报文类型:(1) 差错报文,用于回应网络错误(如目标不可到达和重定向);(2) 查询报文,查询网络信息(如ping程序使用CIMP报文查看目标是否可到达)
               校验:循环冗余校验码
               注意:ICMP并非严格意义上的网络层协议,因为它使用处于同一层的IP协议提供服务,而一般来说应该是上层协议使用下层协议提供的服务。
传输层:
    职责:为两台主机上的一个应用程序提供端到端的通信,只关心通信的起始端和目的端,为应用程序封装了一条端到端的逻辑通信链路,它负责数据的收发,链路的超时重连等。
    协议:
  •     TCP协议(传输控制协议):为应用层提供可靠的,面向链接和基于流的服务。使用超时重传,数据确认方式确保可靠的连接。没有边界限制。
  •     UDP协议(用户数据报协议):不可靠,无连接和基于数据报的服务。数据报有一个长度作为读写的最小单位。
  •     SCTP协议(流控制传输协议):相对较新的传输层协议,为了在因特网上传输电话信号而设计的。
应用层:
    职责:处理应用程序的逻辑。下面三层负责处理网络通信细节,在内核空间中实现,稳定又高效。应用层则在用户空间实现,因为它负责处理众多逻辑。
    协议:telnet协议(远程登陆协议),OSPF(开放最短路径优先协议),DNS(域名服务协议)



2 封装
目的:让上层协议可以使用下层协议提供的服务。
实现:应用程序数据在发送到物理网络上之前,将沿着协议栈从上往下一次传递,每层协议都将在上层数据的基础上加上子集的头部信息,以实现该层的功能。这个过程就叫做封装。如下图所示:
        

经过TCP封装后的数据称为TCP报文段,或者简称TCP段。
  •  TCP报文由TCP头部信息和TCP内核缓冲区数据构成。当要向TCP连接写入发送数据时,内核中的TCP模块首先把这些数据复制到与该连接对应的TCP内核发送缓冲区中,然后TCP模块调用IP模块提供的服务,传递的参数包括TCP头部信息和TCP发送缓冲区中的数据,即TCP报文段。
经过UDP封装后的数据称为UDP数据报。
  • 需要注意的一点是,TCP是发送数据后,依然在缓冲区中保存有副本,但是UDP发送完之后,直接丢弃缓冲区中的数据。
经过IP封装后的数据称为IP数据报。
  •  IP数据报也包括头部信息和数据部分,其中数据部分就是一个TCP报文段、UDP数据报或者ICMP报文。
经过数据链路层封装后的数据称为帧。
  • 传输媒介不同,帧的类型也不同。比如:以太网上传输的是以太网帧,而令牌环网络上传输的则是令牌环帧。
帧的最大传输单元MTU,即指最多能携带多少上层协议数据,通常以太网帧的MTU是1500字节。帧才是最终在物理网络上传送的字节序列。



3 分用
分用:当帧达到目的主机时,将沿着协议栈自底向上依次传递,各层协议依次处理帧中本层负责的头部数据,以获取所需的信息,并最终将处理后的帧交给目标应用程序。这个过程成为分用。

类型:如果类型字段的值为0x800,则帧的数据部分为IP数据包;如果类型字段的值为0x806,则帧的数据部分为ARP请求或应答报文。
  • 因为ICMP、TCP、UDP都使用IP协议,所以IP数据包头部使用16位的协议字段区分它们。
  • TCP报文段和UDP数据包则通过其头部的16位端口号字段来区分上层应用程序。
在顶层目标服务来看,封装和分用似乎并没有发生过。



4 测试网络
测试环境设定:




5 ARP协议工作原理
工作内容:实现任意网络层地址到任意物理地址的转换
工作原理:主机向子集所在的网络广播一个ARP请求,该请求包含目标机器的网络地址,此网络上的其他机器都会收到这个请求,但只有被请求的目标机器会回应一个ARP应答,其中包含自己的物理地址。
报文详解:长度分布:221126464
        
        28字节:ARP请求/应答报文的长度;
        28+18字节:一个携带ARP请求/应带报文的以太网帧长度为46字节
        46+18字节:有的实现要求以太网帧数据部分长度至少为46(所以这里的46和上面的48+18=46没什么关系),在这种情况下,一个携带ARP请求/应答报文的以太网帧长度为64字节。

查看和修改命令:
        
        第一项描述另一台测试机器Kongming20
        第二项描述的是路由器
        删除和添加ARP缓存项命令为:
        
 数据包范例分析:
    下面的两个包是用tcpdump抓取的远程登陆一个机器过程中,在tcp连接简历之前,查询MAC地址的两个ARP数据包(形式上是以太网帧)。
    
第一个数据包:
  • 源物理地址:00:16:d3:5c:b9:e3
  • 目的物理地址:ff::ff::ff::ff::ff::ff,以太网广播地址,用以表示整个LAN,该LAN上的所有机器都会收到并处理这样的帧
  • 类型字段:0x806,表示分用的目标是ARP模块
  • 以太网帧:42字节,实际是46字节,tcpdump未统计以太网帧尾部的4字节CRC字段,其中数据部分长度28字节
  • Request:表示这是一个ARP请求
  • 查询:who-has 192.168.1.109 tell 192.168.1.108 表示查询ip地址为192.168.1.109的机器的物理地址
第二个数据包的内容类似,只是ARP类型不同,改为了应答(Reply)

图解通信过程:

注意:ARP请求和应答应该是从以太网驱动程序发出的,而并非直接从ARP模块发出,所以用虚线表示;路由器也将接收到以太网帧1,因为该帧是一个广播帧。



6 DNS工作原理
工作内容:一套分布式的域名服务系统,处理域名和IP地址的映射
报文详解:
         
        16位标识字段:标记一对DNS查询和应答,以此查区分一个DNS应答i哪个DNS查询的回应。
        16位标志:用于协商具体的通信方式和反馈通信状态
        接下来的4个字段:对查询而言,一般查询问题个数为1,其他三个为0;应答报文应答资源记录数至少为1,授权资源记录数和额外资源记录数可为0或非0
        查询问题格式:(具体不再细说,很容易查到各个字段的含义)
        
        应答,授权和额外信息格式(都使用资源记录格式):
        
Linux下访问DNS服务
    要访问DNS服务,必须先知道DNS服务器的IP地址,存放地址:/etc/resolv.conf,内容如下:
    



7 socket和TCP/IP协议族的关系
数据链路层、网络层、传输层协议是在内核中实现的,因此操作系统需要实现一组系统调用,使得应用程序能够访问这些协议提供的服务。socket就是实现这组系统调用的API。
socket有两个功能:
  • 将应用程序从用户缓冲区中复制到TCP/UDP内核发送缓冲区,以交付内核来发送数据。如,从内核TCP/UDP接收缓冲区中复制数据到用户缓冲区,以读取数据;
  • 应用程序可以通过它们来修改内核中各层协议的某些头部信息或其他数据结构,从而精细地控制底层通信的行为。

参考资料:《Linux高性能服务器编程》

原文地址:https://www.cnblogs.com/wangfengju/p/6172424.html