目录
1.1 TCP/IP协议族体系结构以及主要协议
TCP/IP协议族是一个四层协议系统
自底而上分别是:数据链路层、网络层、传输层、应用层
上层协议使用下层协议提供的服务
1.1.1 数据链路层
数据链路层
1、实现了网卡接口的网络驱动程序,以处理数据在物理媒介(比如以太网、令牌环等)上的传输。
(网络驱动程序隐藏了物理电气细节,为上层协议提供一个统一的接口)
2、有两个常用的协议
ARP协议:地址解析协议 Address Resolve Protocol
RARP协议:逆地址解析协议 Reverse Address Resolve Protocol
它们实现了IP地址和机器物理地址之间的相互转换
3、ARP协议(很重要!)
网络层使用IP地址寻址一台机器,而数据链路层使用物理地址寻址一台机器,
因此网络层必须先将目标机器的IP地址转化成其物理地址,才能使用数据链路层提供的服务
这就是ARP协议的用途
注:
物理地址:通常是MAC地址,以太网、令牌环和802无线网络都使用MAC地址
4、RARP协议
仅用于网络上的某些无盘工作站。
因为缺乏存储设备,无盘工作站无法记住自己的IP地址,
但它们可以利用网卡上的物理地址来向网络管理者(服务器或网络管理软件)查询自身的IP地址。
运行RARP服务的网络管理者通常存有该网络上所有机器的物理地址到IP地址的映射
1.1.2 网络层
网络层
1、网络层:实现数据包的选路和转发
通信的主机之间一般不是直接相连的,而是通过多个中间结点(路由器)连接的
网络层的任务就是:选择这些中间结点,以确定两台主机之间的通信路径
2、网络层最核心的协议是:IP协议(Internet protocol),IP协议根据数据包的目的地址来决定如何投递它
IP协议使用逐跳(hop by hop)的方式确定通信路径
3、另一个重要的协议是ICMP协议(Internet control Message Protocol,因特网控制报文协议)
它是IP协议的重要补充,主要用于检测网络连接
ICMP报文格式是
1. 8位类型字段:用于区分报文类型
2. 8位代码字段:来进一步细分不同的条件
3. 16位校验和字段来对整个报文(包括头部和内容部分)进行循环冗余校验(CRC:Cyclic Redundancy Check)
ICMP协议并不是严格意义上的网络层协议
因为它使用位于同一层的IP协议提供的服务
(一般来说,上层协议使用下层协议提供的服务)
1.1.3 传输层
传输层:
1、为两台主机上的应用程序提供端到端(end to end)的通信
只关心通信的起始端和目的端
2、
数据链路层(驱动程序):封装了物理网络的电气细节
网络层:封装了网络连接的细节
传输层:为应用程序封装了一条端到端的逻辑通信链路,它负责数据的收发、链路的超时重传等
传输层协议主要有三个
1、TCP协议
为应用层提供:可靠的、面向连接的、基于流(stream)的服务
基于流的数据:数据没有边界(长度)限制
它源源不断地从通信的一端流入另一端
发送端可以逐个字节地向数据流中写入数据,接收端也可以逐个字节地将它们读出
使用:超时重传、数据确认等方式来确保数据包被正确地发送到目的地址
因此:TCP服务是可靠的
使用TCP协议通信的双方必须先建立TCP连接,并在内核中为该连接维持一些必要的数据,
比如:连接的状态、读写缓冲区、以及诸多定时器等,
当通信结束时,双方必须关闭连接以释放这些内核数据
2、UDP协议
为应用层提供:不可靠、无连接、基于数据报的服务
不可靠:
无法保证数据从发送端正确地传送到目的端
使用UDP协议的应用程序通常要自己处理数据确认、超时重传等逻辑
无连接:
通信双方不保持一个长久的联系,
因此应用程序每次发送数据都要明确指定接收端的地址(IP地址等信息)
基于数据包的服务:
是相对基于流的服务而言的
每个UDP数据报都有一个长度,接收端必须以该长度为最小单位将其所有内容一次性读出,否则数据将被截断
3、SCTP协议
流控制协议
是为了在因特网上传输电话信号而设计的
1.1.4 应用层
应用层
1、负责处理应用程序的逻辑
数据链路层、网络层和传输层负责处理网络通信细节
这部分必须既稳定又高效,因此它们都在内核空间中实现
应用层则在用户空间实现
它负责处理众多逻辑,比如文件传输、名称查询和网络管理等
应用层协议很多
1、ping是应用程序,而不是协议,
前面说过它利用ICMP报文检测网络连接,是调试网络环境的必备工具
2、telnet协议是一种远程登录协议
它使我们能在本地完成远程任务,比如使用telnet客户端登录到其他服务上
3、OSPF协议(Open Shortest Path First,开放最短路径优先)
是一种动态路由更新协议,用于路由器之间的通信,以告知对方各自的路由信息
4、DNS协议(Domain Name Service,域名服务)
提供机器域名到IP地址的转换
应用层协议(或程序)可能跳过传输层直接使用网络层提供的服务
比如ping程序和OSPF协议
应用层协议(或程序)通常既可以使用TCP服务,又可以使用UDP服务
比如DNS协议
我们能通过/etc/services文件
查看所有知名的应用层协议,
以及它们都能使用哪些传输层服务
1.2 封装
上层协议是如何使用下层协议提供的服务呢?
通过封装
应用层数据在发送到物理网络上之前,将沿着协议栈从上往下依次传递,
每层协议都将在上层数据的基础上加上自己的头部信息(有时还包括尾部信息),以实现该层的功能,这个过程就称为封装。
TCP协议
为通信双方维持一个连接,并且在内核中存储相关数据。
这部分数据中的TCP头部信息和TCP内核缓冲区(发送缓冲区或接收缓冲区)数据一起构成了TCP报文段
发送端应用程序使用send/write函数向一个TCP连接写入数据时,
内核中的TCP模块首先把这些数据复制到与该连接对应的 TCP内核发送缓冲区中,
然后TCP模块调用IP模块提供的服务,传递的参数包括TCP头部信息和TCP发送缓冲区中的数据,即TCP报文段
经过TCP封装后的数据称为TCP报文段(TCP message segment)/TCP段
经过UDP封装后的数据称为UDP数据段(UDP datagram)
UDP无须为应用层数据保存副本
经过IP封装后的数据称为IP数据报(IP datagram)
经过数据链路层封装后的数据称为帧(frame)
根据传输媒介不同,帧的类型也不同
如:以太网帧、令牌环帧
帧的最大传输单元,即帧最多能带多少上层协议数据,通常受到网络类型的限制
过长的IP数据报可能需要被分片(fragment)传输
帧才是最终在物理网络上传送的字节序列
至此,封装过程完成
以太网帧:以太网帧头部和尾部,共18字节
1.3 分用
当帧到达目的主机时,将沿着协议栈自底而上依次传递。
各层协议依次处理帧中本层负责的头部数据,以获取所需要的信息,并最终将处理后的帧交给目标应用程序。
这个过程称为分用。
1.4 测试网络 略
1.5 ARP协议工作原理
ARP协议能实现任意网络层地址到任意物理地址的转换
本书仅讨论从IP地址到以太网地址(MAC地址)的转换
工作原理是:
主机向自己所在的网络(LAN)广播一个ARP请求,
该请求包含目标机器的网络地址(此处指IP地址),
此网络上的其他机器都将收到这个请求,但只有被请求的目标机器会回应一个ARP应答,其中包含自己的物理地址
1.5.1 以太网ARP请求/应答报文详解
1.5.2 ARP高速缓存的查看和修改
通常 ,ARP维护一个高速缓存,其中包含经常访问(比如网管地址)或最近访问的机器的IP地址到物理地址的映射。
这样就避免了重复的ARP请求,提高了发送数据包的速度
1.5.3 使用tcpdump观察ARP通信过程
tcpdump抓取的数据报本质上是以太网帧
1.6 DNS工作原理
我们通常使用机器的域名来访问这台机器,而不是直接使用其IP地址
比如:访问因特网上的各种网站
那么如何将机器的域名转换成IP地址呢?
这就需要使用:域名查询服务
1.6.1 DNS查询和应答报文详解
DNS是一套分布式的域名服务器
每个DNS服务器上都存放着大量的机器名和IP地址的映射,并且是动态更新的
1.6.2 Linux下访问DNS服务
1、要访问DNS服务,必须先知道DNS服务器的IP地址
2、Linux使用/etc/resolv.conf文件来存放DNS服务器的IP地址
3、Linux下一个常用的访问DNS服务器的客户端程序是host
-t 选项是告诉DNS协议使用哪种查询类型
A类型 即通过机器域名获得其IP地址
1.6.3 使用tcpdump观察DNS通信过程
1、运行host命令以查询域名对应的IP地址
2、使用tcpdump抓取这一过程中LAN上传输的以太网帧
port domain :该参数,是用来过滤数据包,表示只抓取使用domain(域名)服务的数据包,即DNS查询和应答报文
DNS查询的两种方式
对于DNS解析,一共有两种查询方式:迭代查询和递归查询,
迭代查询是主机A向服务器B发起DNS查询请求,但是服务器B不知道这个域名的IP地址,则他向主机A返回另外一个服务器C的IP地址,让主机A继续去向服务器C查询,也就是说在这种查询模式下,服务器是不负责任的,都是由主机发起查询请求;
而递归查询不同,若服务器B是递归查询模式,那么对于主机A的查询请求,它会全权代理,如果自己不知道目的主机的IP地址,它会继续向上级DNS服务器查询,直到查到了IP地址再将其返回给主机A。
1.7 socket和TCP/IP协议族的关系
数据链路层、网络层、传输层协议是在内核中实现的。
因此操作系统需要实现一组系统调用,使得应用程序能够访问这些协议提供的服务
实现这组系统调用的API主要是socket
socket这组API提供如下两点功能
1、将应用程序数据从用户缓冲区中复制到TCP/UDP内核发送缓冲区,以交付内核来发送数据(比如send函数)
或者是从内核TCP/UDP接受缓冲区中复制数据到用户缓冲区,以读取数据
2、应用程序可以通过它们修改内核中各层协议的某些头部信息或者其他数据结构,
从而精确的控制底层通信的行为