目录
tcp、ip协议族
tcp/ip协议族是一个四层协议系统,自底下而上分别为数据链路层,网络层,传输层和应用层。
每层完成不同的功能,通过若干协议来实现,上一层使用下层协议提供的服务。
数据链路层
数据链路层实现了网卡接口的网络驱动程序,以处理数据在物理媒介(以太网,令牌环)上得传输。
不同的物理网络具有不同的电气特性,网络驱动程序隐藏了这些细节,为上层协议提供一个统一的接口。
数据链路层两个常用协议:
- ARP(Address Resolve Protocol,地址解析协议)
- RARP(Reverse Address Resolve Protocol,逆地址解析协议)
它们实现了ip地址和机器物理地址(通常指MAC地址.以太网,令牌环和802.11无线网络地址都使用MAC地址)之间的相互转换.
网络层
网络层实现了数据包选路和转发.
WAN(Wide Area Network,广域网)通常使用众多分级的路由器来连接分散的主机或者LAN(Local Area Network,局域网),因此通信的两台主机一般都是通过中间节点(路由器)连接.网络层的任内务就是选择中间节点,以确定两台主机之间的通信路径.同时,网络层对上层协议隐藏了网络拓扑连接的细节.使得在传输层和网络应用来看,通信双方是直接连接.
IP协议(Internet Protocol,因特网协议):网络层的核心协议,ip协议根据数据包的目的IP地址来决定如何投递它.ip协议使用逐级跳(hop by hop)方式确定通信路径.
ICMP协议(Internet Control Message Protocol,因特网控制报文协议):ip协议的重要补充,主要用于检测网络连接.
icmp报文:
- 8位类型:区分报文类型,它将报文分为两大类
- 差错报文:用来回应网络错误,如目标不可达3,重定向5
- 查询报文:用于查询网络信息.ping使用的ICMP报文查看目标是否可到达(类型值为8),有的icmp报文使用8位代码字段来进一步细分不同条件。重定向报文使用代码值0表示对网络重定向,代码值1表示堆主机重定向.ICMP使用16位校验和字段对整个报文(包括头部和内容部分)进行循环冗余校验(Cyclic Redundancy Check,CRC),检验报文在传输过程中是否损坏.ICMP协议并非严格意义上的网络层协议,因为它使用的是ip协议提供的服务.
传输层
传输层位两台主机上得应用程序提供端到端(end to end)得通信,与网络逐跳通信方式不同,传输层只关心通信得起始端和目的端,不在乎数据包得中专过程.
传输层主要有三个协议:
- tcp协议(Transmission Control Protocol,传输控制协议)为应用层提供可靠的,面向连接得和基于流(stream)的服务.tcp使用超时重传,数据确认等方式来确保数据包被正确发送至目的端.因此tcp服务是可靠的.使用tcp协议通信的双方必须先建立起tcp连接,并在内核中为该连接维持一些必要的数据结构:连接状态,读写缓冲区,定时器等.通信结束后,双方必须关闭连接以释放这些内核数据.tcp是基于流的,基于流的数据没有边界(长度)限制.它源源不断地从通信的一端流入另一端.发送端可以逐个字节地向数据流写入数据,接收端也可以逐个字节地将它们读出.
- udp协议(User DataGram protocol,用户数据协议),与TCp完全相反,为应用层提供不可靠服务,无连接和基于数据报的服务.udp无法保证数据报从发送端正确地传送到目的端,如果中途丢失,或者目的端通过数据错误而将其丢弃,udp协议只是简单地通知程序发送失败.使用udp协议的程序通常自己处理数据确认,超时重传等逻辑.udp是无连接,通信双方不保持一个长久的联系,因此应用程序每次发送数据都要明确指定接收端的地址(ip地址等信息).基于数据报的服务,是相对基于流服务而言的,每个udp数报都有一个长度,接收端必须以该长度为最小单位将其一次性读出,否则数据被截断.
- sctp协议(Stream control transmission protocol,流控制传输协议)是一种相对较新的传输层协议,为了因特网传输电话信号设计.
应用层
数据链路层,网络层,传输层负责处理网络通信细节,这部分必须即稳定又高效,因此在内核空间.
应用层负责处理应用程序的逻辑.再用户空间实现,其负责处理众多逻辑。如文件传输等.如果应用层也再内核空间实现,则内核会变的无比庞大.
也有少数服务程序再内核中实现,这样代码就无须再用户空间和内核空间来回切换(主要为数据的复制).这种代码实现起来较为负责不够灵活,且不便于一致.
应用层协议很多:
ping: 应用程序,不是协议,其利用ICMP报文检测网络连接.是调试环境的工具
telnet协议:远程登录协议.
OSPF(open shortest path first,开放最短路径优先)协议是一种动态路由更新协议,用于路由器之间的通信,告知对方各自的路由信息.
DNS(Domain Nmae Service,域名服务)协议提供机器域名到IP地址的转换.
应用层协议或者程序可能跳过传输层直接使用网络层提供得服务,比如ping程序和OSPF协议.应用层协议(或程序)通常既可以使用TCP服务,又可以使用UDP服务,比如DNS协议,我们可以通过/etc/services文件查看所有知名的应用层协议,以及它们都能使用那些传输层服务.
封装-encapsulation
应用层的封装
应用程序数据在发送到物理网络之前,将沿着协议栈从上往下一次传递.每层协议都将在上层数据得基础上加上自己得头部信息(有时还包括尾部信息),以实现该层得功能,这个过程就叫做封装
经过TCP封装后得数据称为TCP报文段(TCP message segment),或者简称tcp段.
tcp为通信双方维持一个连接,并且在内核中存储相关数据.这部分数据中得tcp头部信息和tcp内核缓冲区(发送缓冲区和接收缓冲区)数据一起构成tcp报文段,如图中虚线框所示
传输层的封装
当发送端应用程序使用send(或write)函数向一个TCP连接写入数据时,内核中得TCP模块首先把这些数据复制到与该连接对应的TCP内核缓冲区中, 然后tCP模块调用IP模块提供得服务,传递的参数包括TCP头部信息和TCP发送缓冲区中的数据,即tcp报文段.
经过udp封装后的数据称为udp数据报.封装过程类似tcp,不同的是udp无须为数据保存副本,因为它提供的服务是不可靠的.当udp数据包被发送成功,udp内核缓冲区的该数据报就被丢弃了.如果应用程序检测到该数据报未能被接收端正确接收,并打算重新发送,则只能重新从用户空间将该数据拷贝到udp内核发送缓冲区中.
网络层的封装
经过IP封装后的数据称为IP数据报(IP datagram).ip数据报也分为头部信息和数据部分.其中数据部分就是一个TCP报文段,UDP数据报或者ICMP报文.
数据链路层的封装
经过数据链路层封装的数据被称为帧(frame)
传输媒介不同,帧的类型也不同.以太网上传输的是以太网帧(ethernet frame)
以太网帧使用6字节的目的网络地址和6字节的源物理地址表示通信双方.4字节的CRC字段对帧的其他部分提供循环冗余校验
令牌环网络上传输的则是令牌环帧(token ring frame)
帧最大的最大传输单元(Max Transmit Unit,MTU).帧上最多能携带多少上层协议数据(比如IP数据报),通常受到网络类型的限制.以太网帧的MTU是1500字节.正因为如此,过程的IP数据报可能需要被分片(fragment)传输.
帧才是最终在物理网络上传送的字节序列.封装过程完毕.
分用-demultiplexing
当帧到达目的主机时,将沿着协议栈自底向上一次传递,各层协议一次处理帧中本层负责的头部数据,以获取所需信息,最终将处理后的帧交给目标应用程序.这个过程称为分用
因为IP,ARP,RARP协议都使用帧传输数据,所以帧的头部需要提供某个字段(具体情况取决于帧的类型)来区分它们.以以太网帧为例,它使用2字节的类型字段来标识上层协议.如果主机接收到的以太网帧类型字段的值为0x800,则帧的数据部分为ip数据报.以太网驱动程序就将帧交付给ARP模块;弱类型字段的值为0x835,则帧的数据部分为RARP请求或应答报文,以太网驱动就将帧交付给RARP模块.
因为ICMP,tcp和UDP都使用IP协议,所以IP数据报头部采用了16位的PROTOCOL字段区分他们.
帧通过上述分用步骤后,最终将封装前的原始数据送至目标服务.这样在顶层目标服务看来,封装和奋勇似乎没有发生过
ARP协议工作原理
ARP协议能实现任意网络层地址到任意物理层地址的转换,只讨论ip地址到以太网地址(mac地址)的转换.工作原理:主机向自己所在网络广播一个ARP请求,包含目标机器的网络地址.此网络上的其他机器都接受到这个请求,但只有被请求的目标机器会回应一个ARP应答,其中包含自己的物理地址.
ARP请求/应答报文
格式:
硬件类型 | 协议类型 | 硬件地址长度 | 协议地址长度 | 操作 | 发送端以太网地址 | 发送端IP地址 | 目的端以太网地址 | 目的端IP地址 |
---|---|---|---|---|---|---|---|---|
2字节 | 2字节 | 1字节 | 1字节 | 2字节 | 6字节 | 4字节 | 6字节 | 4字节 |
- 硬件类型字段定义物理地址的类型:1表示mac地址
- 协议类型表示要映射的协议地址类型,值为0x800,表示IP地址.
- 硬件地址长度字段和协议地址长度字段,单位是字节.对mac地址来说长度位6;对IP(v4)地址来说长度为4
- 操作字段指出4中操作类型:ARP请求(1),ARP应答(2),RARP请求(3),RARP应答(4)
- 最后4个字段指定通信双方的以太网地址和ip地址.发送端填充除目的端以太网地址外的其他三个字段,以构建ARP请求并发送之.接收端发现该请求的目的端IP地址是自己,就把自己的以太网地址填进去,然后交换两个目的端地址和两个发送端地址,以构建ARP应当并返回(操作字段设置为2).
一个携带ARP请求/应答报文的以太网帧长度为64字节.
ARP高速缓存的查看和修改
ARP维护一个高速缓存,包含经常访问(网关地址)或最近访问的机器的ip地址到物理地址的映射,这就避免了重复的ARP请求,提高了发送数据报的速度.
Linux下可以用arp
命令查看和修改arp高速缓存.
使用tcpdump观察arp通信过程
说明:arp的请求和应答是从以太网的驱动程序发出,而非像图中直接从arp模块直接发送到以太网.
dns工作原理
dns查询和应答包文详解
dns是一套分布式的域名服务系统.每个dns服务器上都存放大量的机器名和ip地址的映射,并且是动态更新.众多网络用户端程序都使用dns协议来向dns服务器查询目标主机的ip地址.报文格式如图所示:
16位标志字段用于协商具体的通信方式和反馈通信状态.dns报文头部的16位标志字段细节
字节数 | 说明 | |
---|---|---|
QR | 1 | 查询/应答标志,0查询,1应答 |
opcode | 4位 | 查询/应答的类型,1反向查询(由ip获取主机域名),2请求服务状态 |
AA | 1 | 授权应答标志,仅有应答报文使用,1表示域名服务器是授权服务器 |
TC | 1 | 截断标志,仅当DNS报文使用UDP服务时使用,UDP数据报有长度限制,过长的dns报文将被阶段. |
RD | 1 | 递归查询标志,1表示执行递归查询,如果目标dns服务器无法插接某个主机名,则它将向其他dns服务器继续拆线呢,如此递归,知道将获得结果返回给客户端.0表示执行递归 |
RA | 1 | 允许递归标志位,1表示dns服务器支持递归查询 |
zero | 3 | 未使用,必须都设置为0 |
rcode | 4 | 4位返回码,常用值 0-无错误,3-域名不存在 |
socket与tcp/ip
数据链路层,网络层,传输层协议实在内核中实现的.因此操作系统需要实现一组系统调用,使得应用程序能够访问这些协议提供的服务.实现这组系统调用的api(application program interface),主要有两套:socket与XTI,xti基本不用了.
socket定义的这一组api提供两个功能:
- 将应用程序数据从用户缓冲区复制到tcp/udp内核发送缓冲区,以交付内核来发送数据.或者将内核tcp/udp接收缓冲区复制数据到用户缓冲区,以读取数据;
- 应用程序可以通过他们来修改内核中各层协议某些头部信息或者其他数据结构,从而精细地控制底层通信行为.比如可以通过
setsockopt
函数设置IP数据报在网络存货时间.
socket是一套通用的网络编程接口,不但可以访问内核中tcp/ip协议栈,而且可以访问其他网络协议栈(如x.25协议栈,unix本地域协议栈)