标签:lan 计算机 文件 增加 否则 发送数据包 connected 各类 etc
tcp/ip协议族是一个四层协议系统。
图1 TCP/IP体系结构
上层协议通过封装技术使用下层协议提供的服务。应用程序数据在发送到物理网络上之前,将沿着协议栈从上往下逐层封装。每层协议均在上层协议的基础上添加自己的头部(有时含尾部)信息。
图2 封装过程
经过TCP封装后的数据称为TCP报文段,存储在内核空间中,简称TCP段。TCP报文段包括:TCP头部信息和TCP内核缓冲区(包括发送缓冲区和接收缓冲区)。
图3 TCP报文段封装过程
数据发送流程:发送端应用程序使用write函数向一个TCP连接写数据时,内核TCP模块首先把数据从应用程序发送缓冲区复制到与其连接对应的TCP内核发送缓冲区,然后TCP模块调用IP模块服务,将TCP报文段传送给网络层供进一步封装为IP数据报。
经过UDP封装后的数据称为UDP数据报。封装过程与TCP报文段封装过程类似。区别:UDP无需为应用程序保存副本。当UDP数据报发送成功之后,UDP内核缓冲区中的数据报就会被丢弃。如果应用程序检测到该数据报未能被接收端正确接收,并需要重新发送这个数据报,则需要重新从用户空间将数据拷贝到UDP内核发送缓冲区。
经过IP封装后的数据称为IP数据报。IP数据报包括头部信息和数据部分,其数据部分可以是TCP报文段、UDP数据报或者ICMP报文。IP数据报封装完毕后,传给数据链路层进一步封装。
经过数据链路层封装的数据称为帧。传输媒介不同,帧类型也不同。比如:以太网帧,令牌环帧。
以太网帧使用6字节的目的物理地址和6字节源物理地址表示通信双方。帧最大传输单元(Max Transmit Unit,MTU)表示帧最多能携带多少上层协议数据(如IP数据报),通常受网络类型限制。以太网帧MTU=1500字节。因此,过长的IP数据报可能需要被分片(fragment)传输。
图4 以太网帧结构
帧是最终在物理网络上传输的字节序列。至此,封装过程完成。
分用为封装的逆过程。当帧到达目的主机时,将沿着协议栈自底向上依次传递。各层协议依次处理帧中本层的头部信息,并将处理后的数据交给目标应用程序。分用依靠头部信息中类型字段实现,标准文档RFC 1700定义了所有标识上层协议的类型字段以及每个上层协议对应的值。
图5 以太网分用过程
网络层中的IP协议、ARP协议和RARP协议都使用数据链路层提供的帧服务传输数据,因此在数据链路层的帧头部使用一个字段来区分它们。而在以太网中,链路层使用2个字节的类型字段来标志上层(即网络层)协议。主机接收到的以太网帧类型字段取值说明如下:
同理,传输层中的ICMP协议、TCP协议和UDP协议都使用IP协议,所以网络层的IP数据报的头部采用2个字节的协议(protocol)字段来进行区分。
而传输层中的TCP报文段和UDP数据报则通过头部信息中的16位断开号字段来区分应用程序。比如DNS协议对应的端口号为53,HTTP协议对应的端口号为80。其中,所有知名应用程序应用层协议端口号均可以在/etc/services文件中找到。
ARP协议实现网络地址到物理地址的转换。工作原理是:主机向自己所在的网络广播一个ARP请求,该请求包括目标机器的网络地址。网络上其它主机都将收到这个请求,但只有被请求的目标机器会回应这个ARP请求,其中包含自己的物理地址。
图6 以太网ARP请求/响应报文
以太网ARP请求/响应报文字段说明:
以太网ARP请求/响应报文长度为28字节,加上以太网帧头部和尾部18个字节(如图4),则一个携带ARP请求/响应报文的以太网帧长度为46字节。
不过,有的实现要求以太网帧数据部分长度至少46字节,则此时ARP请求/响应报文将增加一些填充字节,以满足要求。此时一个携带ARP请求/响应报文的以太网帧长度为64字节。
ARP维护一个高速缓存,存放其经常访问网关或最近访问机器的IP地址到物理地址的映射,避免重复ARP请求,提高发送数据包速度。
查询命令:
arp -a
用户可以往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通信过程
通过域名查询服务将机器域名转换成IP地址,实现方式有NIS(Network Information Service,网络信息服务)、DNS和本地静态文件。
DNS是一套分布式的域名服务系统。每个DNS服务器上都存放着大量的机器名和IP地址的映射,并且是动态更新的。网络客户端程序都使用DNS协议来向DNS服务器查询目标主机的IP地址。
DNS查询和应答报文格式:
16位标识字段用于标记一对DNS查询和应答,以此区分一个DNS应答是哪个DNS查询的响应。
16位标志段用于协商具体的通信方式和反馈通信状态。DNS报文头部的16位标志段如下图所示:
接下来的4个字段则分别指出DNS报文的最后4个字段的资源记录数目。对查询报文而言,它一般包含1个查询问题,而应答资源记录数、授权资源记录数和额外资源记录上则为0。应答报文的应答资源记录数则至少为1,而授权资源记录数和额外资源记录数可为0或非0。
查询问题格式如下图:
查询名以一定的格式封装要查询的主机域名。16位查询类型表示如何执行查询操作,常见的类型有如下几种:
16位查询类通常位1,表示获取因特网地址(IP地址)。
应答字段、授权字段和额外信息字段都使用资源记录(Resource Record,RR)格式。资源记录格式如下图:
上图中,32位域名是该记录中与资源对应的名字,其格式和查询问题中的查询名字段相同。16位类型和16位类字段的含有也与DNS查询问题的对应字段相同。
32位生存时间表示该查询记录结果可被本地客户端程序缓存多上时间,单位是秒。
16位资源数据长度字段与资源数据字段的内容取决于类型字段。对类型A而言,资源数据是32位的IPv4地址,而资源数据长度则为4字节。
访问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地址。
通过使用如下命令抓起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地址.端口号”的形式来描述通信的某一端:以“>”表示数据传输的方向,“>”前面是源端,后面是目的端。所以:
注:
开启tcpdump -X选项,可以看到DNS报文的每一个字节。也就明白上面31字节查询报文和90字节应答报文的具体含义,如下图所示:
因为数据链路层、网络层、传输层协议是在内核中实现的。因此操作系统需要实现一组系统调用,使得应用程序能够访问这些协议提供的服务。实现这组系统调用的API(Application Programming Interface,应用程序编程接口)主要有两套:socket和XTI,其中XTI已基本弃用。
由socket定义的这组API提供如下两点功能:一是将应用程序数据从用户缓冲区中复制到TCP/UDP内核发送缓冲区,以较复内核来发送数据(比如send函数),或者是从内核TCP/UDP接收缓冲区中复制数据到用户缓冲区,以读取数据;二是应用程序可以通过它们来修改内核中各层协议的某些头部信息或其他数据结构,从而精细地控制底层通信行为。比如可通过setsockopt函数来设置IP数据报在网络上的存活时间。
另外,socket是一套通用网络编程接口,不但可以访问内核中TCP/IP协议栈,而且可以访问其他网络协议栈(如:X.25协议栈、UNIX本地域协议栈等)。
注:笔记来源《Linux高性能服务器编程》
标签:lan 计算机 文件 增加 否则 发送数据包 connected 各类 etc
原文地址:https://www.cnblogs.com/zhongqifeng/p/14555474.html