🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ## TCP/IP协议族结构 TCP/IP协议族是一个四层协议系统,自底而上分别是数据链路层、网络层、传输层和应用层。上层协议使用下层协议提供的服务。 ![wq8MJe.png](https://s1.ax1x.com/2020/09/21/wq8MJe.png) ### 数据链路层 数据链路层实现了网卡接口的网络驱动程序,以处理数据在物理媒介上的传输。不同的物理网络有不同的电气特性,网络驱动隐藏了这些细节。网络驱动为上层协议提供了统一的接口。 ` ` >数据链路层常用协议:ARP(address resolve protocol 地址解析协议)和RARP(Reverse address resolve protocol逆地址解析协议)。他们实现了IP地址和机器物理地址(MAC,以太网)之间的转换。 网络层使用IP地址寻址一台机器,数据链路层使用物理地址寻址一台机器。网络层通过ARP协议把目标机器的IP地址转化成物理地址,才能使用数据链路层提供的服务。 ### 网络层 网络层实现数据包的选路和转发。WAN(Wide Area Network,广域网)通常使用分级的路由器来连接分散的主机或LAN(Local Area Network,局域网)。通信的两台主机通常是通过多个节点(路由器)连接的。 >网络层的任务就是选择中间节点,以确定两台主机之间的通信路径。网络层对上层隐藏了网络拓扑的细节,使得在传输层和应用层看来,通信的双方是直接相连的。 网络层的核心是**IP协议**(Internet Protocol,因特网协议)。IP协议使用逐跳的方式确定通信路径。 网络层另一个重要的协议是**ICMP**(Internet Control Message Protocol,因特网控制报文协议),它是IP协议的重要补充,主要用来网络检测。 ![](https://s1.ax1x.com/2020/09/21/wqtBNV.png) ### 传输层 传输层为两台主机上的应用层序提供端到端的通信。与网络层的逐跳通信不同,传输层只关心通信的起始端和目的端,而不在乎数据包的中转过程。 ![](https://s1.ax1x.com/2020/09/21/wqNkbn.png) 垂直实线箭头表示TCP/IP协议族各层之间的实体通信(数据包确实沿着这条路线传递的),而水平虚线表示逻辑通信线路。 传输层主要协议有三个:TCP、UDP、SCTP协议 1. TCP TCP协议(Transmission Control Protocol,传输控制协议),为应用层可靠、面向连接和基于流的服务。具有超时重传、数据确认等特性来保证数据包被正确的发送至目的端。 2. UDP UDP协议(User Datagram Protocol,用户数据报协议)则与TCP完全相反,它为应用层提供不可靠、无连接和基于数据报的服务 3. SCTP SCP协议(Stream Control Transmission Protocol,流控制传输协议)是一种相对比较新的传输层协议,它是为了在因特网上传输电话信号而设计的。 ### 应用层 应用层负责应用程序的逻辑。数据链路层、网络层和传输层负责网络通信细节,这部分必须即稳定又高效,因此都在内核空间中实现。 应用层的协议有很多: * ping,利用ICMP报文检测网络连接 * telnet是一种远程登录协议 * OSPF(Open Short Path First,开放最短路径优先)是一种动态路由更新协议,用于路由器之间的通信。告知对方各自的路由信息 * DNS(Domain Name Service, 域名服务)提供机器域名到IP地址的转换。 ## 封装 通过封装,上层协议可以使用下层协议提供的服务。应用程序在发送到物理网络上之前,将沿着协议栈从上往下依次传递。每层协议都在上层数据的基础上加上自己的头部信息(有时还包括尾部信息),以实现该层的功能,这个过程叫封装。 ![](https://s1.ax1x.com/2020/09/21/wqUaF0.png) TCP报文封装过程: ![](https://img.kancloud.cn/ec/a4/eca4980e9bf976854932be0d847c93ef_1770x774.png) 经过数据链路层封装的数据称为帧(frame)。传输媒介不同,帧的类型也不同。比如以太网上传输的是以太网帧(ethernet frame),而令牌环网络上传输的则是令牌环帧(token ring frame)。 ![](https://s1.ax1x.com/2020/09/21/wqURFx.png) ## 分用 当帧到达目的主机时,将沿着协议栈自底向上依次传递。各层协议依次处理帧中本层负责的头部数据,以获取所需信息,并最终将处理后的帧交给目标应用程序。这个过程叫做分用。 ` ` 分用是依靠头部信息中的类型字段实现的,标准文档RFC1700定义了所有标识上层协议的类型字段以及每个上层协议对应的数值。 ![](https://s1.ax1x.com/2020/09/21/wqamX4.png) ## arp协议工作原理 ARP协议能实现任意网络层地址到任意物理地址的转换。 工作原理是: 主机自己所在的网络广播一个ARP请求,该请求包含目标机器的网络地址。此网络上的其他机器都收到这个请求,但只有被请求的目标机器回应一个ARP应答,其中包含自己的物理地址。 ### 以太网ARP请求/应答报文详解 ![](https://s1.ax1x.com/2020/09/22/wXeDFH.png) 硬件类型字段定义物理地址的类型,它的值为1表示MAC地址 协议类型字段表示要映射的协议地址类型,它的值为0x800,表示IP地址 硬件地址长度字段和协议地址长度,其单位是字节。对mac地址来说,其长度是6,对IP地址(IPV4)来说,其长度是4。 操作字段指出4钟操作类型;ARP请求(值为1)、ARP应答(值为2)、RARP请求(值为3)和RARP应答(值为4) >ARP请求/应答报文的长度是28字节。加上以太网帧头部和尾部的18字节,则一个携带APR请求/应答报文的以太网帧长度为46字节,此时ARP请求/应答报文将增加一些填充字节,以满足这个要求。 ### ARP高速缓存的查看和修改 通常,ARP维护一个高速缓存,在linux上使用arp指令来查看和修改arp缓存 ``` arp -a ``` ![wXKu9J.png](https://s1.ax1x.com/2020/09/22/wXKu9J.png) ### 使用tcpdump观察arp通信 为了清楚的了解arp的运作过程,在机器a(192.168.0.3)上执行telnet 命令登录机器b(192.168.0.3)的echo服务。并用tcpdump抓取这个过程中这两台测试机器之间交换的以太网帧。 ``` $ sudo arp -d 192.168.0.3 // 清楚ARP缓存中机器b的对应项。 $ sudo tcpdump -i eth0 -ent '(dst 192.168.0.3 and src 192.168.0.4) or (dst 192.168.0.4 and src 192.168.0.3)‘ //如无特殊声明,抓包都要在机器a上执行 $ telnet 192.168.0.3 echo // 开启另一个终端执行telnet 命令 // 输入Ctrl + ]并回车 telnet> quit(回车) Connection closed ``` ## dns工作原理 DNS是一套分布式的域名服务系统,每个DNS服务器上存放着大量的机器名和IP地址的映射,并且是动态更新的。众多客户端都通过DNS协议来想DNS服务器查询目标主机的IP地址 ![](https://s1.ax1x.com/2020/09/22/wXlABt.png) * 16位标识字段用于标记一对DNS查询和应答,以此区分一个DNS应答是对应哪一个DNS的查询回应 * 16位标志字段用于协商具体的通信方式和反馈通信状态,DNS报文头部的16位标志字段的细节如图所示 ![](https://s1.ax1x.com/2020/09/22/wXlc4O.png) * QR, 查询/应答标志,0表示查询,1表示应答 * opcode,定义查询和应答的类型,0表示标准查询,1表示反向查询(由IP地址获得主机域名),2表示请求服务状态 * AA,授权应答标志,仅由应答报文使用,1表示域名服务器是授权服务器。 * TC,截断标志,仅当DNS报文使用UDP服务时使用。因为UDP数据报有长度限制,所以过长的DNS报文将被截断,1表示DNS报文超过521字节,并被截断。 * RD,递归查询标志。1表示执行递归查询,即如果目标DNS服务器无法解析某个主机名,则它将向其他DNS服务器继续查询。如此递归,知道返回结果。 * RA, 允许递归标志。仅由应答报文使用。1表示DNS服务器支持递归查询 * zero,这3位未用,必须都设置为0 * rcode,4位返回码,表示应答的状态,常用值0(无错误)和3(域名不存在) ### linux上访问DNS服务 要访问DNS服务,必须先知道DNS服务器的IP地址。linux上使用`/etc/resolv.conf`文件来存放DNS服务的IP地址 ``` nameserver 219.239.26.42 nameserver 124.207.160.106 ``` 常用客户端程序`host`命令查询`www.baidu.com`的IP地址 ``` $ host -t A www.baidu.com www.baidu.com is an alias for www.a.shifen.com. www.a.shifen.com has address 36.152.44.96 www.a.shifen.com has address 36.152.44.95 ``` ### 使用tcpdump观察DNS通信全过程 ``` $ sudo tcpdump -i eth0 -nt -s 500 port domain $ host -t A www.baidu.com ``` 使用port domain 来过滤数据包。表示只抓取domain(域名)服务的数据包。 ## socket和tcp/ip协议族的关系 使得应用程序能够调用系统内核中的数据链路层、网络层、传输层的这些协议提供的服务的API共有两套:socket和XTI。XTI基本不再用。 由socket定义的这一组API提供如下两点功能: 1. 将应用程序数据从用户缓冲区中复制到TCP/UDP内核发送缓冲区,交给内核来发送数据,或者是从内核TCP/UDP接收缓冲区中复制数据到用户缓冲区,以读取数据。 2. 二是应用程序可以通过他们来修改内核中各层协议的某些头部信息或其他数据结构,从而精细的控制底层通信的行为。比如可以通过setsockopt函数来设置IP数据报在网络上的存活时间。socket是一套通用的网络编程接口,它不但可以访问内核中TCP/IP协议栈,而且可以访问其他网络协议栈(比如X.25栈、UNIX本地域协议栈等)