1.TCP/IP 协议族
1.1 TCP/IP协议族及主要协议
TCP/IP 协议族是一个四层协议系统。
自上而下为(如下图所示):
应用层
传输层
网络层
数据链路层
应用层负责处理应用程序逻辑,在用户空间实现。(少数服务器程序在内核中实现。)
数据链路层、网络层、传输层负责处理网络通信细节,这部分必须即稳定又高效,因此他们都在内核空间中实现。
上层协议使用下层协议提供的服务
,这个如何实现的详见1.2 封装。
1.1.1 数据链路层
实现网卡接口的网络驱动程序;
处理数据再物理媒介(以太网、令牌环等)上的传输 。
常用协议:
ARP,Address Resolve Protocol,地址解析协议 (重点)
RARP,Reverse Address Resolve Protocol,逆地址解析协议。
以此实现IP地址和机器物理地址(通常是MAC地址)之间的相互转换。
以太网、令牌环、802.11无线网络 都是用MAC地址。
网络层通过IP地址寻址,而数据链路层通过物理地址(通常是MAC)寻址
。
故网络层必须先将目标IP转化为其物理地址,才能使用数据链路层提供的服务,即ARP的用途。
RARP可不是用来MAC转IP的。RARP协议仅用于网络上的某些无盘工作站。(不重要,百度了解即可)
1.1.2 网络层
实现数据包的选路和转发。
IP,Internet Protocol,因特网协议
ICMP,Internet Control Message Protocol,因特网控制报文协议
WAN,Wide Area Network,广域网
LAN,Local Area Network,局域网
WAN通常使用 众多分级路由器来 连接 分散的 主机或LAN。
网络层就是选择这些中间节点,以确定两台主机之间的通信路径。
同时网络层对上层隐藏网络拓扑细节,使上层看来通信双方是直接相连的。
网络层通信流程:
根据:IP协议根据数据包的目的IP来决定如何投递。
流程(IP协议使用逐跳(hop by hop)的方式确定通信路径):
1.IP协议为数据包寻找合适吓一跳(next hop)路由器,并将数据包交付给该路由器转发。
2.多次重复过程1,直到数据包到达目标主机,或者由于发送失败而被丢弃。
1.1.2.1 ICMP
1.1.2.2 IP 协议详解
1.1.3 传输层
为两台主机上的应用程序提供端到端(end to end)的通信。
负责数据的收发、链路的超时重连等等。
包含协议:
TCP、UDP、SCTP
传输层只关心通信的起始段和目的端,不在乎数据包的中转过程。
如下图:
垂直实线:表示TCP/IP协议族各层之间的实体通信(数据包的传递)
水平虚线:代表逻辑通信线路
由图:
数据链路层 封装了物理网络的细节;
网络层 封装了网络连接的细节;
传输层 则为应用程序封装了一条端到端的逻辑通信链路,它负责数据的收发、链路的超时重连等。
1.1.3.1 TCP
1.1.3.2 UDP
1.1.3.3 SCTP
SCTP(Stream Control Transmission Protocol,流控制传输协议)
相对较新的传输层协议,
为在因特网上传输电话信号而设计。
自行百度了解。
1.1.4 应用层
应用层负责处理应用程序逻辑,在用户空间实现(少数服务器程序在内核中实现。)。
数据链路层、网络层、传输层负责处理网络通信细节,这部分必须即稳定又高效,因此他们都在内核空间中实现。
应用层协议很多:
如:
telent,远程登录协议,能在本地完成远程任务。
OSPF(Open Shortest Path First,开放最短路径优先)是一种动态路由更新协议,用于路由器之间的通信,以告知对方各自的路由信息。
DNS(Domain Name Service,域名服务)提供机器域名到IP地址的转换。
注意:
1.ping是应用程序,不是协议。利用ICMP报文检测网络连接。
2.应用层协议(或程序)可能跳过传输层直接使用网络层提供的服务:
如:
ping程序和OSPF。
3.应用层协议(或程序)通常即可以使用TCP服务,又可以使用UDP服务,
如;
DNS协议。
4.命令查看所有知名应用层协议,以及都能使用哪些传输层服务,如下
cat /etc/services
1.2 封装
对于顶层目标服务来看,封装和分用似乎没发生过。
TCP/IP协议族间通过 封装
实现上层协议使用下层协议提供的服务。
封装流程(如下图所示):
应用层数据发送到物理网络之前,将沿着协议栈 从上往下 依次传递。
每层协议都在上层数据基础上增加自己的 头部信息(有的还包括尾部信息),以实现该层功能。
1.2.1 传输层封装
1.2.1.1 TCP封装
经过TCP协议封装后的数据称为TCP报文段(TCP message segment),封装过程如下图所示。
如图:
TCP报文段组成位置在内核空间。
TCP报文段 = IP数据报的数据部分 = TCP头部信息 + TCP内核发送缓冲区数据(即用户空间应用程序发送据)
应用程序利用TCP发送数据流程:
发送端应用程序使用send(或write)向TCP连接写入数据
-> 内核TCP模块将这些数据复制到与该连接对应的TCP内核缓冲区
-> 然后TCP模块调用IP模块服务,传递给IP服务 TCP报文段。
1.2.1.2 UDP封装
UDP封装后的数据称为UDP数据报(UDP datagram)。
与TCP封装类似。不同之处如下:
1.由于UDP的服务不可靠,故UDP不为应用层数据保存副本,当一个数据报发送成功,那该数据报就会被丢弃。
2.由于1.的特性,若应用程序检测到发送数据未被接收端正确接收,并打算重发,只能重新从用户空间再拷贝到UDP内核发送缓冲区。
1.2.2 网络层封装
1.2.2.1 IP封装
IP封装后的数据称为IP数据报(IP datagram)。
IP数据报 = 头部信息 + 数据部分 (数据部分就是一个TCP报文 或 UDP报文 或ICMP报文)
1.2.3 数据链路层封装
1.2.3.1 帧
数据链路层封装的数据称为帧(frame)。
帧的最大传输单元(Max Transmit Unit,MTU):
即帧最多能携带多少上层协议数据(如IP数据报),通常受网络类型限制。
如下图1-6,MTU=1500字节。
因此根据数据报长度可能被分片(fragment)传输。
根据传输媒介区分帧分类:
1. 以太网传输的是 以太网帧(ethernet frame),如下图示例。
2. 令牌环网络上传输的是 令牌环帧(token ring frame)。
以太网帧 组成:
通信双方: 6字节目的物理地址 + 6字节源(本地)物理地址
类型:标识上层协议的类型字段,每个上层协议对应一个数值。
CRC :对帧的其他部分提供循环冗余校验。
1.3 分用
对于顶层目标服务来看,封装和分用似乎没发生过。
分用(demultiplexing)是一个过程(如下图所示):
当 数据链路层的帧 到达目的主机,将沿着协议栈 自底向上 依次传递;
-> 各层协议依次处理帧中本层负责的 头部数据,以获取所需信息;
-> 并最终将处理后的帧 交给目标应用程序。
分用 依靠帧头部信息中的类型字段实现。
例:
IP、ARP、RARP都用帧传输。
1.若主机收到的以太网帧中类型字段值为 0x800 ,则帧数据部分为IP数据报,以太网驱动程序就将帧交付给IP模块。
2.若主机收到的以太网帧中类型字段值为 0x806,则帧数据部分为RARP请求或应答报文,以太网帧就将帧交付给RARP模块。
引申:
1.ICMP、TCP、UDP都使用IP协议,故IP数据报头部采用 16位协议(protocol)字段来区分。
2.TCP、UDP则通过其 头部中 16位端口号(port number)字段区分上层应用程序。
3.因2.,所有应用程协议都有自己的端口号。如HTTP协议(Hyper-Text Transfer Protocol,超文本传送协议)端口号为80.DNS协议端口号为53等.
1.4 网络测试
此处简写,详见书中内容。
通过抓取ARP和DNS在网络上传输的以太网帧,并查看其中的以太网帧头部、IP数据报头部等信息,深入理解TCP/IP协议族的工作机制。
1.4.1 网络准备
1.4.2 ARP协议工作原理
ARP(Address Resolution Protocol,地址解析协议)
地址解析:
就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。
ARP基本功能:
就是实现任意网络层地址 到 任意物理地址的转换,以保证通信的顺利进行。
此处只讨论 IP地址到以太网地址(此处只是MAC地址)的转换。
ARP协议工作原理:
主机向自己所在的网络广播一个ARP请求(包含目标机器的网络地址)。
-> 网络上其它机器都将收到这个请求
-> 但只有被请求的目标机器回应一个ARP应答,其中包含自己的物理地址。
1.4.2.1 以太网ARP请求/应答报文详解
如下图:
硬件类型: 物理地址类型。 如1 表示MAC地址。
协议类型: 要映射的协议地址类型。 如0x800 表示IP地址。
硬件地址长度: 对应硬件类型,如 硬件类型为1,此处就是MAC地址长度为6.
协议地址长度: 对应协议类型,如 协议类型值为ox800,此处就是IP(若为v4)地址长度4.
操作 (4种): ARP请求 值为1,ARP应答 值为2,RARP请求 值为3,RARP应答 值为4。
剩余四个字段:
发送请求时,发送端除 目的端以太网地址 其它三个都填,以构建ARP请求。
收到请求时,目的端填入 目的端以太网地址,并交换目的端地址和发送端地址,以构建ARP应答。
引申:
一般情况:
ARP请求/应答报文长度 46字节 = 28字节(ARP请求应答报文长度,图1-9) + 18字节(以太网帧头部及尾部长度)
特殊情况(有的实现要求以太网帧数据部分长度至少为46字节,此时ARP请求/应答报文要填充一些字节):
ARP请求/应答报文长度 至少64字节 = 28字节(ARP请求/应答报文长度,图1-9)+ 至少18字节(ARP请求/应答报文填充字节) + 18字节(以太网帧头部和尾部)
1.4.2.2 以太网ARP高速缓存查看和修改
通常,ARP维护一个高速缓存,其中包含经常访问的IP地址到物理地址的映射。
以此避免重复ARP请求,提高发送数据包速度。
Linux查看和修改ARP高速缓存命令如下:
1.4.2.3 使用tcpdump观察ARP通信过程
想了解的可以仔细看看。
1.4.3 DNS工作原理
通常,我们使用机器的域名访问这台服务器,而不直接用IP地址,如访问互联网上的网站。
机器域名转换为IP 使用 域名查询服务。
域名查询服务实现方式有很多,如:
1.NIS(Network Information Service,网络信息服务)
2.DNS
3.本地静态文件
4...等等
DNS简介:
1.DNS是一套分布式的域名服务系统。
2.每个DNS服务器上都存放大量的 机器名和IP地址 的映射,且是动态更新的。
3.众多网络客户端程序都是用DNS来向DNS服务器查询目标主机的IP地址。
4.DNS查询和应答报文详见下一小节。
1.4.3.1 DNS查询和应答报文详解
注:此处 标识 和 标志 严格区分,含义不同。
16位标示识: 标记一对DNS查询和应答,以此区分一个DNS应答是哪个DNS查询的回应。
16位标志: 用于协商具体的通信方式和反馈通信状态。 详见下面小节 1.4.3.1.1 DNS头部16位标志字段详解
接下来四个字段(16位问题个数、16位应答资源记录个数、16位授权资源记录数目、16位额外资源记录数目):
分别指出DNS报文的最后4个字段的资源记录数目。
对查询报文来说:
一般包含1个查询问题,而 应答资源记录个数、授权资源记录数目、额外资源记录数目则为0.
对应答报文来说:
应答资源记录个数至少为1,而授权资源记录数目和额外资源记录数目可为0或非0.
查寻问题:使用一定格式, 详见 下面小结 1.4.3.1.2 DNS头部 查询问题格式。
应答、授权几额外信息: 都使用资源记录(Resource Record,RR)格式。详见下面小结 1.4.3.1.3 DNS头部 资源记录格式。
1.4.3.1.1 DNS头部16位标志字段详解
1.4.3.1.2 DNS头部 查询问题格式
1.4.3.1.3 DNS头部 资源记录格式
1.4.3.2 Linux下访问DNS服务
1.4.3.3 使用tcpdump观察DNS通信过程
1.5 socket 和TCP/IP协议族的关系
如以上章节可知,数据链路层、网络层、传输层协议实在内核中实现的。
故操作系统需要实现一组系统调用,使应用程序能够使用这些协议提供的服务。
实现这组系统调用的API(Application Programming Interface,应用程序接口)主要有两套:
1.socket,现在的主流。
2.XTI,已不再使用。
socket实现的API提供两点功能:
1.将应用程序数据
从用户缓冲区中复制到TCP/UDP内核发送缓冲区,以交付内核来发送数据;
或者是从内核TCP/UDP接收缓冲区中复制数据到用户缓冲区,以读取数据。
2.应用程序可以通过它们来修改内核中各层协议的某些头部信息或其它数据结构,
从而精细的控制底层通信行为。
如:
setsockopt函数来设置IP数据报在网络上的存活时间。
socket
是一套通用网络编程接口
,不但可以访问内核中的TCP/IP协议栈
,还可以访问其它网络协议栈
(如X.25协议栈、UNIX本地域协议栈等)