TCP/IP协议族

马哥Linux运维

共 7008字,需浏览 15分钟

 ·

2024-05-18 19:23

1、体系结构

tcp/ip协议族是一个四层协议系统。

图1 TCP/IP体系结构 

  • 数据链路层:实现网卡接口的网络驱动程序,处理数据在物理媒介(以太网、令牌环)上的传输。网络驱动程序屏蔽不同物理网络的电器特性。数据链路层使用ARP和RARP协议实现IP地址与MAC地址之间的相互转换(网络层使用IP地址寻址网络计算机,而数据链路层使用物理地址寻址网络中的计算机)。

  • 网络层:使用IP协议实现数据包在计算机网络、主机之间路由和转发,使用ICMP协议检测网络连接。IP协议使用逐跳(hop by hop)方式确定通信路径,数据包通过目标IP寻址目标主机,如果不能直接寻址主机时,则由IP协议为其寻址合适的下一跳路由器。ICMP协议服务基于同层的IP协议实现,因此并非严格意义上的网络层协议。

  • 传输层:使用TCP、UDP、SCTP协议为两台主机上的应用程序提供端到端(end to end)的通信。与网络层使用逐跳的通信方式不同,传输层只关系通信的起始端和目的端,不在乎数据的中转过程。

  • 应用层:数据链路层、网络层、传输层在内核空间中实现,应用层在用户空间实现。负责众多应用程序逻辑。应用层协议包括http,dns,telnet,ospf等协议。

2、封装

上层协议通过封装技术使用下层协议提供的服务。应用程序数据在发送到物理网络上之前,将沿着协议栈从上往下逐层封装。每层协议均在上层协议的基础上添加自己的头部(有时含尾部)信息。

图2 封装过程

2.1 TCP报文段

经过TCP封装后的数据称为TCP报文段,存储在内核空间中,简称TCP段。TCP报文段包括:TCP头部信息和TCP内核缓冲区(包括发送缓冲区和接收缓冲区)。

图3 TCP报文段封装过程

 数据发送流程:发送端应用程序使用write函数向一个TCP连接写数据时,内核TCP模块首先把数据从应用程序发送缓冲区复制到与其连接对应的TCP内核发送缓冲区,然后TCP模块调用IP模块服务,将TCP报文段传送给网络层供进一步封装为IP数据报。

2.2 UDP数据报

经过UDP封装后的数据称为UDP数据报。封装过程与TCP报文段封装过程类似。区别:UDP无需为应用程序保存副本。当UDP数据报发送成功之后,UDP内核缓冲区中的数据报就会被丢弃。如果应用程序检测到该数据报未能被接收端正确接收,并需要重新发送这个数据报,则需要重新从用户空间将数据拷贝到UDP内核发送缓冲区。

2.3 IP数据报

经过IP封装后的数据称为IP数据报。IP数据报包括头部信息和数据部分,其数据部分可以是TCP报文段、UDP数据报或者ICMP报文。IP数据报封装完毕后,传给数据链路层进一步封装。

2.4 帧

经过数据链路层封装的数据称为帧。传输媒介不同,帧类型也不同。比如:以太网帧,令牌环帧。

2.5 以太网帧

以太网帧使用6字节的目的物理地址和6字节源物理地址表示通信双方。帧最大传输单元(Max Transmit Unit,MTU)表示帧最多能携带多少上层协议数据(如IP数据报),通常受网络类型限制。以太网帧MTU=1500字节。因此,过长的IP数据报可能需要被分片(fragment)传输。

图4 以太网帧结构

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

3、分用

分用为封装的逆过程。当帧到达目的主机时,将沿着协议栈自底向上依次传递。各层协议依次处理帧中本层的头部信息,并将处理后的数据交给目标应用程序。分用依靠头部信息中类型字段实现,标准文档RFC 1700定义了所有标识上层协议的类型字段以及每个上层协议对应的值。

图5 以太网分用过程

网络层中的IP协议、ARP协议和RARP协议都使用数据链路层提供的帧服务传输数据,因此在数据链路层的帧头部使用一个字段来区分它们。而在以太网中,链路层使用2个字节的类型字段来标志上层(即网络层)协议。主机接收到的以太网帧类型字段取值说明如下:

  • 0x800:表示帧的数据部分为IP数据报,以太网驱动程序将帧交给IP模块。

  • 0x806:表示帧的数据部分为ARP请求或应答报文,以太网驱动程序将帧交给ARP模块。

  • 0x835:表示帧的数据部分为RARP请求或应答报文,以太网驱动程序将帧交给RARP模块。

同理,传输层中的ICMP协议、TCP协议和UDP协议都使用IP协议,所以网络层的IP数据报的头部采用2个字节的协议(protocol)字段来进行区分。

而传输层中的TCP报文段和UDP数据报则通过头部信息中的16位断开号字段来区分应用程序。比如DNS协议对应的端口号为53,HTTP协议对应的端口号为80。其中,所有知名应用程序应用层协议端口号均可以在/etc/services文件中找到。

4、ARP协议工作原理

ARP协议实现网络地址到物理地址的转换。工作原理是:主机向自己所在的网络广播一个ARP请求,该请求包括目标机器的网络地址。网络上其它主机都将收到这个请求,但只有被请求的目标机器会回应这个ARP请求,其中包含自己的物理地址。

4.1 以太网ARP请求/响应报文

图6 以太网ARP请求/响应报文

以太网ARP请求/响应报文字段说明:

  • 硬件类型:定义物理地址类型,1表示MAC地址。

  • 协议类型:表示要映射的协议地址类型,0x800表示IP地址。

  • 硬件地址长度:单位为字节,对MAC地址来说,其长度为6。

  • 协议地址长度:单位为字节,对IP(v4)地址来说,其长度为4。

  • 操作字段:为4种操作类型。1=ARP请求,2=ARP响应,3=RARP请求,4=RARP响应。

  • 最后四个字段指定通信双方的以太网地址和IP地址。发送端填写除目的以太网地址外的其它3个字段,以构建ARP请求。接收端填充自己的以太网地址,并交换两个目的端地址和发送端地址,同时修改操作类型(设置为2)。

以太网ARP请求/响应报文长度为28字节,加上以太网帧头部和尾部18个字节(如图4),则一个携带ARP请求/响应报文的以太网帧长度为46字节。

不过,有的实现要求以太网帧数据部分长度至少46字节,则此时ARP请求/响应报文将增加一些填充字节,以满足要求。此时一个携带ARP请求/响应报文的以太网帧长度为64字节。

4.2 ARP 高速缓存

ARP维护一个高速缓存,存放其经常访问网关或最近访问机器的IP地址到物理地址的映射,避免重复ARP请求,提高发送数据包速度。

查询命令:

arp -a

用户可以往ARP缓存中添加或删除缓存项。

 4.3 ARP通信过程

通过108远程登录109实验,说明ARP通信过程:

1)清除ARP缓存中目标地址(否则ARP通信不被执行)

sudo arp -d 192.168.1.109

2)使用tcpdump抓ARP包。

sudo tcpdum -i eth0 -ent '(dst 192.168.1.109 and src 192.168.1.108) or (dst 192.168.1.108 adn 192.168.1.109)'

3)在测试机器执行telnet命令,远程登录192.168.1.109机器。

telnet 192.168.1.109 echo

当执行telnet命令并在两台通信主机之间建立TCP连接后(telnet输出"Connected to 192.168.1.109"),输入Ctrl+]调出telnet程序命令提示符,然后再telnet命令提示符后输入quit,退出telnet客户端程序(因为APR通信在TCP连接建立之前就已经完成,故不需要关心后续内容)。tcpdump抓到的众多数据包中,只有最靠前的两个和ARP通信有关系。显示如下:

图7 首次远程登录以太网帧

 由tcpdump抓起的数据包本质上是以太网帧,通过该命令的众多选项来控制帧的过滤(比如用dst和src指定通信的目的端IP地址和源端IP地址)和显示(比如用-e选项开启以太网帧头部信息的显示)。

第一个数据包中,ARP通信源端物理地址是00:16:d3:5c:b9:e3,目的端物理地址是ff:ff:ff:ff:ff:ff,为以太网广播地址,表示整个局域网。该局域网上所有的机器都会收到并处理这样的帧。数值0x0806是以太网帧头部的类型字段的值,表示分用的目标是ARP模块。该以太网帧长度为42字节(实际上是46字节,tcpdump为统计以太网帧尾部4个字节的CRC字段),其中数据部分长度为28字节。“Request”表示这是一个ARP请求,“who-has 192.168.1.109 tell 192.168.1.108”则表示108机器要查询的109机器的IP地址。

第二个数据包中,ARP通信的源端物理地址是08:00:27:53:10:67,目标端的物理地址是00:16:d3:5c:b9:e3。“Reply”表示这是一个请求应答,“192.168.1.109 is at 08:00:27:53:10:67”则表示目标机器109报告其物理地址。该以太网帧长度为60字节(实际上是64字节),可见它使用了填充字节来满足最小帧长度。

图8 ARP通信过程

 

5、DNS工作原理

 通过域名查询服务将机器域名转换成IP地址,实现方式有NIS(Network Information Service,网络信息服务)、DNS和本地静态文件。

5.1 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服务时使用。因为UDP数据报有长度限制,所有过长的DNS报文将被截断,1表示DNS报文超过512字节,并被截断。

  • RD,递归查询标志。1=执行递归查询,即如果目标DNS服务器无法解析某个主机名,则它将向其他DNS服务器继续查询,如此递归,直到获得结果并把该结果返回给客户端。0=执行迭代查询,即如目标DNS服务器无法解析某个主机名,则它将自己知道的其他DNS服务器的IP地址返回给客户端,以供客户端参考。

  • RA,允许递归标志。仅由应答报文使用,1表示DNS服务器支持递归查询。

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

  • rcode,5位返回码,表示应答状态。0=无错误,3=域名不存在。

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

查询问题格式如下图:

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

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

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

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

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

应答字段、授权字段和额外信息字段都使用资源记录(Resource Record,RR)格式。资源记录格式如下图:

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

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

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

5.2 Linux下访问DNS服务

访问DNS服务,必须知道DNS服务器的IP地址。Linux使用/etc/resolv.conf文件来存放DNS服务器IP地址。

其中,两个IP地址分别是首选DNS服务器地址和备选DNS服务器地址。

Linux下常用访问DNS服务器的客户端程序是host,比如下列命令是向首选DNS服务器219.239.26.42查询机器www.baidu.com的IP地址:

host命令输出显示,机器名www.baidu.com是www.a.shifen.com的别名。且该机器名对应两个IP地址。host命令使用DNS协议和DNS服务器通信,其-t选项表示DNS协议使用哪种各类型查询。此处使用A类型,即通过机器的域名获取其IP地址。

5.3 使用tcpdump观察DNS通信过程

通过使用如下命令抓起LAN网上传输的以太网帧。

sudo tcpdump -i enp2s0 -nt -s 500 port domain
host
-t A www.baidu.com

使用tcpdump抓包时,使用“port domain”来过滤数据包,表示只抓取使用domain(域名)服务的数据包,即DNS查询和应答报文。tcpdump输出如下:

这两个数据包开始的“IP”指出,它们后面的内容描述的是IP数据报。tcpdump以“IP地址.端口号”的形式来描述通信的某一端:以“>”表示数据传输的方向,“>”前面是源端,后面是目的端。所以:

  • 第一个数据报是测试机器(IP地址:192.168.6.16)向其首先DNS服务器(192.168.6.1)发送DNS查询报文(目的端口53是DNS服务使用的端口号),数值51930是DNS查询报文标志,因此也出现在DNS应答报文中。"+"表示启用递归查询标志,"A?"表示使用A类型查询方式,"www.baidu.com"则是DNS查询问题中的查询名。括号中的数值31表示DNS查询报文的长度(以字节文单位);

  • 第二个数据报是服务器反馈的DNS应答报文。数据包中,"3/0/0"表示该报文中包含3个应答资源记录,0个授权资源记录和0个额外信息记录。" CNAME www.a.shifen.com., A 180.101.49.12, A 180.101.49.11 "表示3个应答资源记录的内容。其中CNAME表示紧随其后的记录是机器的别名,A表示紧随其后的记录是IP地址。应答报文的长度为90字节。

注:

开启tcpdump -X选项,可以看到DNS报文的每一个字节。也就明白上面31字节查询报文和90字节应答报文的具体含义,如下图所示:

5.4 Socket与TCP/IP协议族的关系

因为数据链路层、网络层、传输层协议是在内核中实现的。因此操作系统需要实现一组系统调用,使得应用程序能够访问这些协议提供的服务。实现这组系统调用的API(Application Programming Interface,应用程序编程接口)主要有两套:socket和XTI,其中XTI已基本弃用。

由socket定义的这组API提供如下两点功能:一是将应用程序数据从用户缓冲区中复制到TCP/UDP内核发送缓冲区,以较复内核来发送数据(比如send函数),或者是从内核TCP/UDP接收缓冲区中复制数据到用户缓冲区,以读取数据;二是应用程序可以通过它们来修改内核中各层协议的某些头部信息或其他数据结构,从而精细地控制底层通信行为。比如可通过setsockopt函数来设置IP数据报在网络上的存活时间。

另外,socket是一套通用网络编程接口,不但可以访问内核中TCP/IP协议栈,而且可以访问其他网络协议栈(如:X.25协议栈、UNIX本地域协议栈等)。

链接:https://www.cnblogs.com/zhongqifeng/p/14555474.html

(版权归原作者所有,侵删)


浏览 92
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报