TCP/IP 网络协议基础入门

文章目录

    • 1、TCP/IP简介
      • IP 地址
      • 域名
      • MAC 地址
      • 端口号
      • 封装和分用
    • 2、链路层介绍
      • 控制帧的传输
        • 差错控制
        • 反馈重发
        • 计时器
        • 序号
        • 流量控制
      • 以太网
      • PPP(点对点协议)
      • SLIP 与 PPP
        • SLIP 协议
        • PPP 协议
      • MTU
    • 3、IP网际协议
      • IP 数据报
      • IP 地址分类
        • A 类地址
        • B 类地址
        • C 类地址
      • 子网划分
      • IP 路由选择
      • NAT 技术
      • IP 的未来
    • 4、网络层其它协议
      • ARP
        • 功能
        • 原理
        • ARP 代理
        • ARP 欺骗
      • RARP
      • ICMP
      • ping 程序
        • ping 简介
        • TTL 值
        • Ping 命令判断操作系统
      • traceroute 程序
        • traceroute
        • traceroute 工作原理
      • IGMP
    • 5、传输层:UDP协议
      • 传输层协议
      • 端口
      • UDP 概述
      • UDP 报文
        • tcpdump 抓取 UDP 报文
    • 6、传输层:TCP协议
      • TCP 报文段结构
      • 连接的建立与释放
      • TCP 可靠传输的实现
      • 超时重传
      • 连续 ARQ 协议
      • 流量控制和拥塞控制
      • tcpdump 抓取 TCP 报文段
    • 7、应用层协议
      • DNS 协议
        • DNS 服务器
        • host 命令
        • DNS 报文
        • DNS 缓存和 hosts 文件
      • FTP 协议
      • HTTP 协议
      • Telnet 协议
        • Telnet 简介
        • Telnet 工作过程
        • Telnet 连接远程主机
        • Telnet 连接远程主机
      • TFTP 协议
        • TFTP 报文格式
      • SMTP 协议和 POP3 协议
        • SMTP 简介
        • POP3 简介
        • POP3 和 SMTP 协同工作

1、TCP/IP简介

提到网络协议栈结构,最著名的当属 OSI 七层模型,但是 TCP/IP 协议族的结构则稍有不同,它们之间的层次结构有如图对应关系:

TCP/IP 网络协议基础入门_第1张图片
可见 TCP/IP 被分为 4 层,每层承担的任务不一样,各层的协议的工作方式也不一样,每层封装上层数据的方式也不一样:

  • 应用层:应用程序通过这一层访问网络,常见 FTP、HTTP、DNS 和 TELNET 协议;
  • 传输层:TCP 协议和 UDP 协议;
  • 网络层:IP 协议,ARP、RARP 协议,ICMP 协议等;
  • 网络接口层:是 TCP/IP 协议的基层,负责数据帧的发送和接收。

TCP/IP(Transmission Control Protocol/Internet Protocol)是传输控制协议和网络协议的简称,它定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。

TCP/IP 不是一个协议,而是一个协议族的统称,里面包括了 IP 协议、ICMP 协议、TCP 协议、以及 http、ftp、pop3 协议等。网络中的计算机都采用这套协议族进行互联。

IP 地址

网络上每一个节点都必须有一个独立的 IP 地址,通常使用的 IP 地址是一个 32bit 的数字,被 . 分成 4 组,例如,255.255.255.255 就是一个 IP 地址。有了 IP 地址,用户的计算机就可以发现并连接互联网中的另外一台计算机。

在 终端输入 ifconfig -a 命令查看自己的 IP 地址:
TCP/IP 网络协议基础入门_第2张图片

域名

用 12 位数字组成的 IP 地址很难记忆,在实际应用时,用户一般不需要记住 IP 地址,互联网给每个 IP 地址起了一个别名,习惯上称作域名。

域名与计算机的 IP 地址相对应,并把这种对应关系存储在域名服务系统 DNS(Domain Name System) 中,这样用户只需记住域名就可以与指定的计算机进行通信了。

常见的域名包括 com、net 和 org 三种顶级域名后缀,除此之外每个国家还有自己国家专属的域名后缀(比如我国的域名后缀为 cn)。目前经常使用的域名诸如百度(www.baidu.com)、Linux 组织(www.lwn.net)等等。

我们可以使用命令 nslookup 或者 ping 来查看与域名相对应的 IP 地址,由于实验楼网络限制,我们可以使用 ping github.com(如果 github 也 ping 不通,那么可以使用 ping labfile.oss.aliyuncs.com,如果你是会员账户,那么也可以 ping 其他的域名)查看。

MAC 地址

MAC(Media Access Control)地址,或称为物理地址、硬件地址,用来定义互联网中设备的位置。

在 TCP/IP 层次模型中,网络层管理 IP 地址,链路层则负责 MAC 地址。因此每个网络位置会有一个专属于它的 IP 地址,而每个主机会有一个专属于它 MAC 地址。

端口号

IP 地址是用来发现和查找网络中的地址,但是不同程序如何互相通信呢?这就需要端口号来识别了。如果把 IP 地址比作一间房子,端口就是出入这间房子的门。真正的房子只有几个门,但是端口采用 16 比特的端口号标识,一个 IP 地址的端口可以有 65536(即:216)个之多!

服务器的默认程序一般都是通过人们所熟知的端口号来识别的。例如,对于每个 TCP/IP 实现来说,SMTP(简单邮件传输协议)服务器的 TCP 端口号都是 25,FTP(文件传输协议)服务器的 TCP 端口号都是 21,TFTP(简单文件传输协议)服务器的 UDP 端口号都是 69。任何 TCP/IP 实现所提供的服务都用众所周知的 1-1023 之间的端口号。这些人们所熟知的端口号由 Internet 端口号分配机构(Internet Assigned Numbers Authority,IANA)来管理。

常用协议对应端口号:

  • SSH 22
  • FTP 20 和 21
  • Telnet 23
  • SMTP 25
  • TFTP 69
  • HTTP 80
  • SNMP 161
  • Ping 使用 ICMP,无具体端口号

封装和分用

封装:当应用程序发送数据的时候,数据在协议层次当中自顶向下通过每一层,每一层都会对数据增加一些首部或尾部信息,这样的信息称之为协议数据单元(Protocol Data Unit,缩写为 PDU),在分层协议系统里,在指定的协议层上传送的数据单元,包含了该层的协议控制信息和用户信息。如下图所示:

  • 物理层(一层)PDU 指数据位(Bit)
  • 数据链路层(二层)PDU 指数据帧(Frame)
  • 网络层(三层)PDU 指数据包(Packet)
  • 传输层(四层)PDU 指数据段(Segment)
  • 第五层以上为数据(data)
    TCP/IP 网络协议基础入门_第3张图片
    分用:当主机收到一个数据帧时,数据就从协议层底向上升,通过每一层时,检查并去掉对应层次的报文首部或尾部,与封装过程正好相反。

2、链路层介绍

上一节已经介绍过,网络层协议的数据单元是 IP 数据报,而数据链路层的工作就是把网络层交下来的 IP 数据报 封装为帧(frame)发送到链路上,以及把接收到的帧中的数据取出并上交给网络层。 为达到这一目的,数据链路必须具备一系列相应的功能,主要有:

  • 将数据封装为帧(frame),帧是数据链路层的传送单位;
  • 控制帧的传输,包括处理传输差错,调节发送速率与接收方相匹配;
  • 在两个网络实体之间提供数据链路通路的建立、维持和释放的管理。

数据帧的结构是这样的:
TCP/IP 网络协议基础入门_第4张图片

控制帧的传输

下面我们将会学习控制帧的传输。

差错控制

通信系统必须具备发现差错的能力,并采取措施纠正之,使差错控制在所能允许的尽可能小的范围内,这就是差错控制过程,也是数据链路层的主要功能之一。

反馈重发

接收方通过对差错编码(奇偶校验码或 CRC 码)的检查,可以判定一帧在传输过程中是否发生了差错。一旦发现差错,一般可以采用反馈重发的方法来纠正。这就要求接受方收完一帧后,向发送方反馈一个接收是否正确的信息,使发送方据此做出是否需要重新发送的决定。发送方仅当收到接收方已正确接收的反馈信号后才能认为该帧已经正确发送完毕,否则需要重发直至正确为止。

计时器

如果某一帧发送出现问题,一直不能发送成功,为了避免传输过程停滞不前,通常引入计时器(Timer)来限定接收方发回反馈消息的时间间隔。当发送方发送一帧的同时也启动计时器,若在限定时间间隔内未能收到接收方的反馈信息,即计时器超时(Timeout),则可认为传出的帧已出错或丢失,就要重新发送。

序号

由于同一帧数据可能被重复发送多次,就可能引起接收方多次收到同一帧并将其递交给网络层的情况。为了防止这种情况,可以采用对发送的帧编号的方法,即赋予每帧一个序号,从而使接收方能从该序号来区分是新发送来的帧还是重发的帧,以此来确定要不要将接收到的帧递交给网络层。

流量控制

由于收发双方各自使用的设备工作速率和缓冲存储空间的差异,可能出现发送方的发送能力大于接收方接收能力的现象,此时若不对发送方的发送速率做适当的限制,前面来不及接收的帧将被后面不断发送来的帧“淹没”,从而造成帧的丢失而出错。

由此可见,流量控制实际上是对发送方数据流量的控制,使其发送速率不超过接收方的速率。所以需要一些规则使得发送方知道在什么情况下可以接着发送下一帧,而在什么情况下必须暂停发送,以等待收到某种反馈信息后再继续发送。这就是流量控制。

以太网

以太网(Ether-net)是指 DEC 公司、Intel 公司和 Xerox 公司在 1982 年联合公布的一个标准,这个标准里面使用了一种称作 CSMA/CD 的接入方法。而 IEEE802 提供的标准集 802.3(还有一部分定义到了 802.2 中)也提供了一个 CSMA/CD 的标准。

PPP(点对点协议)

PPP(点到点协议)是为在同等单元之间传输数据设计的链路层协议。这种链路提供全双工操作,并按照顺序传递数据。设计目的主要是用来通过拨号或专线方式建立点对点连接发送数据,使其成为各种主机、网桥和路由器之间简单连接的一种共通的解决方案。

点对点协议(PPP)为在点对点连接上传输多协议数据包提供了一个标准方法。PPP 最初设计是为两个对等节点之间的 IP 流量传输提供一种封装协议。在 TCP/IP 协议集中它是一种用来同步调制连接的数据链路层协议。

SLIP 与 PPP

下面我们将会学习 SLIP 与 PPP。

SLIP 协议

SLIP 的全称为 Serial Line IP(串行线路 IP)。它是一种对 IP 数据报进行封装的简单形式。

SLIP 协议规定的帧格式规则:

  • IP 数据报以一个称作 END(0xc0)的特殊字符结束。同时为了防止数据报传输之前的线路噪音被误认为是数据报内容,在数据报开始处添加一个 END 字符;
  • 如果 IP 数据报中含有 END 字符,就连续传输 0xdb 和 0xdc 来取代它。0xdb 是 SLIP 的 ESC 字符,但它的值与 ASCⅡ 码中的 ESC(0x1b)不同;
  • 如果 IP 数据报中含有 ESC 字符,就连续传输 0xdb 和 0xdd 来取代它。
    TCP/IP 网络协议基础入门_第5张图片

SLIP 的缺陷:

  • 每一端必须知道对端的 IP 地址,没有办法把本端 IP 地址传递给对端;
  • 数据帧中无类型字段,当一条串行线路使用 SLIP 时则不能使用其它协议;
  • SLIP 数据帧中无 checksum,只能依靠上层协议来发现和纠正错误。
    (参考SLIP 串行线路 IP)

PPP 协议

PPP 协议修改了 SLIP 协议中的缺陷,包括以下三个部分:

  • PPP 封装 IP 数据报既支持数据为 8 位和无奇偶校验的异步模式,又支持面向比特的同步链接;
  • 通过 LCP(链路控制协议)允许双方进行协商;
  • 通过 NCP(网络控制协议)允许双方在网络层上进行协商。 PPP 协议的字符规则与 SLIP 有所不同:
  • PPP 帧以标志字符 0x7e 开始和结束,紧接着是一个值为 0xff 的地址字节,然后是一个值为 0x03 的控制字节;
  • 由于标志字符是 0x7e,当它出现在信息字段中时,需要连续传送 0x7d 和 0x5e 来替代它;
  • 当在信息字段中遇到 0x7d 时,需要连续传送 0x7d 和 0x5d 来替代它。
  • 默认情况下,如果字符的值小于 0x20,需要连续传送 0x7d 和 0x21 来替代它。 PPP 与 SLIP 相比具有下列优点:
  • PPP 支持在单根串行线路上运行多种网络层协议;
  • 每一帧都有 CRC 校验;
  • 通信双方可以用 NCP 进行 IP 地址的动态协商;
  • 可以类似于 CSLIP 对 TCP 和 IP 首部进行压缩;
  • LCP 可以对多个数据链路选项进行设置。

MTU

为了提供足够快的响应时间,以太网和 IEEE802.3 对数据帧长度都有限制,其最大值分别为 1500 字节和 1492 字节,链路层的这个特性称作 MTU,即最大传输单元

当网络层传下来一个 IP 数据报,并且其长度比链路层的 MTU 大,那么网络层就需要对数据报进行分片,使每一片都小于 MTU。

MTU 分为接口 MTU 和路径 MTU:

接口 MTU 是指定的接口所允许发送的最大数据长度;
路径 MTU 指两台通信主机路径中最小的 MTU 值。路径 MTU 是不对称的,它在两个方向上不一定一致。
用命令 netstat -in 可以查看网络接口的 MTU:

3、IP网际协议

IP 数据报:IP 协议位于网络层,它是 TCP/IP 协议族中最为核心的协议,所有的 TCP、UDP、ICMP 及 IGMP 数据都以 IP 数据报格式传输。IP 协议提供的是不可靠、无连接的数据报传送服务。

IP 数据报

我们已经知道了 IP 协议提供的数据传送服务是不可靠和无连接的,具体表现如下:

  • 不可靠(unreliable):IP 协议不能保证数据报能成功地到达目的地,它仅提供传输服务。当发生某种错误时,IP 协议会丢弃该数据报。传输的可靠性全由上层协议来提供。
  • 无连接(connectionless):IP 协议对每个数据报的处理是相互独立的。这也说明,IP 数据报可以不按发送顺序接收。如果发送方向接收方发送了两个连续的数据报(先是 A,然后是 B),每个数据报可以选择不同的路线,因此 B 可能在 A 到达之前先到达。

我们先看一下 IP 数据报的格式,其中没有一个字段是多余的,学习 IP 协议就应从学习它的报文字段意义和作用开始。

TCP/IP 网络协议基础入门_第6张图片
如上图所示,普通的 IP 数据报的报头长度 20 字节(除非有选项字段),各个部分的作用:

  • 版本号:4 位,用于标明 IP 版本号,0100 表示 IPv4,0110 表示 IPv6。目前常见的是 IPv4。
  • 首部长度:4 位,表示 IP 报头长度,包括选项字段。
  • 服务类型(TOS):分别有:最小时延、最大吞吐量、最高可靠性、最小花费 4 种服务,如下图所示。4 个标识位只能有一个被置为 1。
  • 总长度:16 位,报头长度加上数据部分长度,便是数据报的总长度。IP 数据报最长可达 65535 字节。
  • 标识:16 位,接收方根据分片中的标识字段相不相同来判断这些分片是不是同一个数据报的分片,从而进行分片的重组。通常每发送一份报文它的值就会加 1。
  • 标志:3 位,用于标识数据报是否分片。其中的第 2 位是不分段(DF)位。当 DF 位被设置为 1 时,则不对数据报进行分段处理;第 3 位是分段(MF)位,除了最后一个分段的 MF 位被设置为 0 外,其他的分段的 MF 位均设置为 1。
  • 偏移:13 位,在接收方进行数据报重组时用来标识分片的顺序。
  • 生存时间(TTL):8 位,用于设置数据报可以经过的最多的路由器个数。TTL 的初始值由源主机设置(通常为 32 或 64),每经过一个处理它的路由器,TTL 值减 1。如果一个数据报的 TTL 值被减至 0,它将被丢弃。
  • 协议:8 位,用来标识是哪个协议向 IP 传送数据。ICMP 为 1,IGMP 为 2,TCP 为 6,UDP 为 17,GRE 为 47,ESP 为 50。
  • 首部校验和:根据 IP 首部计算的校验和码。
  • 源 IP 和目的 IP :数据报头还会包含该数据报的发送方 IP 和接收方 IP。
  • 选项:是数据报中的一个可变长、可选的信息,不常用,多用于安全、军事等领域。

了解了上面的理论知识过后,我们可以使用 tcpdump 这个抓包工具来实际看一下。

sudo tcpdump -ntx -c 1

-n :显示 IP 地址而非域名地址
-t :不显示时间戳
-x :以十六进制显示包内内容
-c :tcpdump 将在接受到几个数据包后退出

TCP/IP 网络协议基础入门_第7张图片
首先看到开头的 192.168.42.3.3001 > 172.16.2.250.44632 代表的是源 ip 为 192.168.42.3,端口 3001,目的 ip 为 172.16.2.250,端口 44632。

然后看到 0x0000 那行:

  • 协议版本: 0x4 表示的是协议版本为 IPv4;
  • 首部长度: 0x5,5*4=20,表示 IP 报头长度为 20 字节。一个字节通常等于 8 位,所以这里可以知道 IP 报头为 4500 到 02fa;
  • TOS 服务类型:0x00,意味着是一般服务;
  • 总长度:0x0136,换算下来为 310 字节;
  • 标识:0x172a;
  • 3bit 标志 + 13bit 片偏移:0x4000;
  • 生存时间:0x40,值为 64;
  • 协议:0x06,代表 TCP 协议;
  • 首部校验和:0x88e2。
  • 源 IP:c0a8 2a03 (192.168.42.3)
  • 目标 IP:ac10 02fa (172.16.2.250)

IP 地址分类

为了便于寻址以及层次化构造网络,每个 IP 地址可被看作是分为两部分,即网络号和主机号。同一个区域的所有主机有相同的网络号(即 IP 地址的前半部分相同),区域内的每个主机(包括路由器)都有一个主机号与其对应。

IP 地址被分为 A、B、C、D、E 五类:

  • A 类给大型网络或政府机构等;
  • B 类分配给中型网络、跨国企业等;
  • C 类分配给小型网络;
  • D 类用于多播;
  • E 类用于实验。

各类可容纳的地址数目不同,其中我们最常见的为 A、B、C 这三类。

IP 地址用 32 位二进制数字表示的时候,A、B、C 类 IP 的网络号长度分别为 8 位、16 位、24 位:
TCP/IP 网络协议基础入门_第8张图片

A 类地址

A 类地址网络号范围:1.0.0.0—127.0.0.0;
A 类 IP 地址范围:1.0.0.0—127.255.255.255;
A 类 IP 的私有地址范围:10.0.0.0—10.255.255.255 (所谓的私有地址就是在互联网上不使用,而被用在局域网络中的地址);
127.X.X.X 是保留地址,用做循环测试用的;
因为主机号有 24 位,所以一个 A 类网络号可以容纳 2 24 − 2 2^{24}-2 2242 =16777214 个主机号。

B 类地址

B 类地址网络号范围:128.0.0.0—191.255.0.0;
B 类 IP 地址范围:128.0.0.0—191.255.255.255;
B 类 IP 的私有地址范围:172.16.0.0—172.31.255.255;
169.254.X.X 是保留地址;191.255.255.255 是广播地址;
因为主机号有 16 位,所以一个 B 类网络号可以容纳 2 16 − 2 2^{16}-2 2162=65534 个主机号。

C 类地址

C 类地址网络号范围:192.0.0.0—223.255.255.0;
C 类 IP 地址范围:192.0.0.0—223.255.255.255;
C 类 IP 的私有地址范围:192.168.0.0—192.168.255.255;
因为主机号有 8 位,所以一个 C 类网络号可以容纳 28-2=254 个主机号。

子网划分

IP 地址如果只使用 ABCDE 类来划分,会造成大量的浪费:一个有 500 台主机的网络,无法使用 C 类地址。但如果使用一个 B 类地址,6 万多个主机地址只有 500 个被使用,造成 IP 地址的大量浪费。

因此,可以在 ABC 类网络的基础上,进一步划分子网:占用主机号的前几个位,用于表示子网号

这样 IP 地址就可看作 IP = 网络号 + 子网号 + 主机号

子网号的位数没有硬性规定,于是我们用子网掩码来确定一个 IP 地址中哪几位是主机号,具体使用方法如图:
TCP/IP 网络协议基础入门_第9张图片
子网掩码中的 1 标识了 IP 地址中相应的网络号和子网号,0 标识了主机号。将 IP 地址和子网掩码进行逻辑与运算,结果就能区分网络号和子网号。

IP 路由选择

如果发送方与接收方直接相连(点对点)或都在一个共享网络上(以太网),那么 IP 数据报就能直接送达。

而大多数情况则是发送方与接收方通过若干个路由器(router)连接,那么数据报就需要经过若干个路由器的转发才能送达,它是怎么选择一个合适的路径来"送货"的呢?

IP 层在内存中有一个路由表(输入命令 route -n 可以查看路由表),当收到一份数据报并进行发送时,都要对该表进行搜索:

  • 1、搜索路由表,如果能找到和目的 IP 地址完全一致的主机,则将 IP 数据报发向该主机;
  • 2、搜索路由表,如果匹配主机失败,则匹配同子网的路由器(这需要子网掩码的协助)。如果找到路由器,则将该 IP 数据报发向该路由器;
  • 3、搜索路由表,如果匹配同子网路由器失败,则匹配同网络号路由器,如果找到路由器,则将该 IP 数据报发向该路由器;
  • 4、如果以上都失败了,就搜索默认路由,如果默认路由存在,则发报;
  • 6、如果都失败了,就丢掉这个包;
  • 7、接收到数据报的路由器再按照它自己的路由表继续转发,直到数据报被转发到目的主机;
  • 8、如果在转发过程中,IP 数据报的 TTL(生命周期)已经被减为 0,则该 IP 数据报就被抛弃。

实验环境中可以使用 route -n 查看路由表:
另外我们可以使用 traceroute 来追踪路由过程。首先需要安装一下:

sudo apt-get update
sudo apt-get install -y traceroute

接下来使用 traceroute 追踪本机到 www.shiyanlou.com 的路由:
TCP/IP 网络协议基础入门_第10张图片
记录按序列号从 1 开始,每个记录就是一跳,每跳表示一个网关,我们看到每行有三个时间,单位是 ms,这是探测数据包向每个网关发送三个数据包后,网关响应后返回的时间。用这三个时间来表示到达这个结点的网络速度。

我们会看到有一些行是以星号表示的。出现这样的情况,可能是防火墙封掉了 ICMP 的返回信息,所以我们得不到什么相关的数据包返回数据。

还有一些其他选项,比如:

  • 设置跳数为 8
traceroute -m 8 www.shiyanlou.com
  • 探测包个数设为 4
traceroute -q 4 www.shiyanlou.com
  • 显示 IP 地址,不查主机名
traceroute -n www.shiyanlou.com

NAT 技术

当你用 ifconfig 查看 IP 地址时,有时你会发现自己的 IP 地址是这样的———192.168.X.X 或 172.16.X.X。这是 C 类网和 B 类网的私有地址,就是俗称的内网 IP。这是因为你的路由器采用了 NAT 技术。

NAT(Network Address Translation,网络地址转换)是 1994 年提出的。当在专用网内部的一些主机本来已经分配到了内网 IP 地址,但现在又想和因特网上的主机通信时,NAT 技术将其内网 IP 地址转换成全球 IP 地址,然后与因特网连接,也就是说,内网的数台主机使用了同一个全球 IP 地址在上网。

NAT 技术实现了宽带共享,而且有助于缓解 IP 地址空间枯竭的问题。

使用 ifconfig eth0 查看内网 ip:

IP 的未来

我们现在使用的 IPv4 协议版本从理论上讲,可以编址 1600 万个网络、40 亿台主机。但采用 A、B、C 三类编址方式后,可用的网络地址和主机地址的数目大打折扣,以至 IP 地址已于 2011 年 2 月 3 日分配完毕。

其中北美占有 3/4,约 30 亿个,而人口最多的亚洲只有不到 4 亿个,中国截止 2010 年 6 月 IPv4 地址数量达到 2.5 亿,落后于 4.2 亿网民的需求。地址不足,严重地制约了中国及其他国家互联网的应用和发展。

随着网络技术的发展,计算机网络将进入人们的日常生活,可能身边的每一样东西都需要连入全球因特网,在这样的环境下,IPv6 应运而生。

IPv6 的地址长度是 128 位,通常将这 128 位的地址按每 16 位划分为一个段,将每个段转换成十六进制数字,并用冒号隔开,比如:2000:0000:0000:0000:0001:2345:6789:abcd 就是一个 IPv6 地址。

单从数量级上来说,IPv6 所拥有的地址容量是 IPv4 的约 8×10^28 倍,达到 2128(算上全零的)个。这不但解决了网络地址资源数量的问题,同时也为除电脑外的设备连入互联网在数量限制上扫清了障碍。

随着 IPv4 不足,支持 IPv6 的网络迅速增长,现在全球已经有 5% 的网络使用 IPv6。

4、网络层其它协议

网络层不仅有 IP 协议,还有其它如 ARP、ICMP、IGMP、RARP 等其它协议,这一节我们将对这些协议做介绍。

TCP/IP 网络协议基础入门_第11张图片

ARP

功能

当主机通过数据链路发送数据的时候,IP 数据报会先被封装为一个数据帧,而MAC 地址会被添加到数据帧的报头(链路层介绍时已讲过)。

ARP 便是在这个过程中通过目标主机的 IP 地址,查询目标主机的 MAC 地址。

原理

在你的电脑和路由器中都有一个 ARP 缓存表,其中保存的是近期(20 分钟)与自己有过通信的主机的 IP 地址与 MAC 地址的对应关系。

ARP 缓存表使用过程:

  • 当主机要发送一个 IP 数据报的时候,会首先查询一下自己的 ARP 缓存表;
  • 如果在 ARP 缓存表中找到对应的 MAC 地址,则将 IP 数据报封装为数据帧,把 MAC 地址放在帧首部,发送数据帧;
  • 如果查询的 IP-MAC 值对不存在,那么主机就向网络中广播发送一个 ARP 请求数据帧,ARP 请求中包含待查询 IP 地址;
  • 网络内所有收到 ARP 请求的主机查询自己的 IP 地址,如果发现自己符合条件,就回复一个 ARP 应答数据帧,其中包含自己的 MAC 地址;
  • 收到 ARP 应答后,主机将其 IP - MAC 对应信息存入自己的 ARP 缓存,然后再据此封装 IP 数据报,再发送数据帧。

你可以通过命令 arp -a 查看 ARP 缓存表(表项记录 20 分钟超时),这里介绍几个主要选项:

命令 描述
-a 显示 ARP 高速缓存中的所有内容
-d 从 ARP 缓冲区中删除指定主机的 ARP 条目
-s 设置指定的主机的 IP 地址与 MAC 地址的静态映射
-v 显示详细的 arp 缓冲区条目,包括缓冲区条目的统计信息

下面使用 arp 命令实际查看一下 arp 缓存:

arp
arp -a
arp -v

ARP 代理

如果 ARP 请求是从一个网络上的主机发往另一个网络上的主机,那么连接这两个网络的路由器就可以回答该 ARP 请求,这个过程称作代理 ARP(Proxy ARP)。

当连接这两个网络的路由器收到该 ARP 请求时,它会发现自己有通向目的主机的路径,随后它会将自己(路由器)的 MAC 地址回复给源主机。源主机会认为路由器的 MAC 地址就是目的主机的 MAC 地址,而对于随后发来的数据帧,路由器会转发到它后面真实 MAC 地址的目的主机。

两个物理网络之间的路由器可以使这两个网络彼此透明化,在这种情况下,只要路由器设置成一个 ARP 代理,以响应一个网络到另一个网络主机的 ARP 请求,两个物理网络就可以使用相同的网络号。

ARP 欺骗

从 ARP 代理的原理可以看出来:IP - MAC 的对应信息很容易被伪造!黑客可以伪造 ARP 应答数据帧而欺骗 ARP 请求者,从而达到截获数据的目的。

RARP

听名字就知道,RARP 与 ARP 是相反的关系,用于将 MAC 地址转换为 IP 地址。对应于 ARP,RARP 请求以广播方式传送,而 RARP 应答一般是单播传送的。

某些设备,比如无盘机在启动时可能不知道自己的 IP 地址,它们可以将自己的 MAC 地址使用 RARP 请求广播出去,RARP 服务器就会响应并回复无盘机的 IP 地址。

RARP 在目前的应用中已极少被使用,不再赘述了。

ICMP

通信过程中发生各种问题时,ICMP 将问题反馈,通过这些信息,管理者可以对所发生的问题作出诊断,然后采取适当的措施去解决它。

ICMP 报文由 8 位错误类型、8 位条件代码和 16 位校验和组成,被封装在一个 IP 数据报中:
在这里插入图片描述

报文的类型字段可以有 15 个不同的值,以便描述特定类型的 ICMP 报文,代码字段的值进一步描述不同的条件,各报文类型描述可参考 ICMP_百度百科

也有一些出现差错而不产生 ICMP 报文的情况,比如:

  • ICMP 差错报文;
  • 目的地址是广播或多播地址;
  • 作为链路层广播的数据报;
  • 不是 IP 分片的第一片;
  • 源地址不是单个主机的数据报(源不能为零地址、环回地址、广播多播地址)。

ping 程序

ping 程序和 traceroute 程序是两个常见的基于 ICMP 协议的工具。

ping 简介

ping 程序是对两台主机之间连通性进行测试的基本工具,它只是利用 ICMP 回显请求和回显应答报文,而不用经过传输层(TCP/UDP)。

ping 程序通过在 ICMP 报文数据中存放发送请求的时间值来计算往返时间,当应答返回时,用当前时间减去存放在 ICMP 报文中的时间值,即是往返时间。

ping 程序使用方法为 ping IP 地址,ping 命令还可以加上参数,实现更多的功能:

  • -n 只输出数值;
  • -q 不显示任何传送封包的信息,只显示最后的结果;
  • -r 忽略普通的 Routing Table,直接将数据包送到远端主机上,通常是查看本机的网络接口是否有问题;
  • -R 记录路由过程;
  • -v 详细显示指令的执行过程;
  • -c 数目:在发送指定数目的包后停止;
  • -i 秒数:设定间隔几秒传送一个网络封包给一台机器,预设值是一秒送一次;
  • -t 存活数值:设置存活数值 TTL 的大小。

下面使用 ping 向 mirrors.cloud.aliyuncs.com 发送 1 个数据包。
下面我们用 tcpdump 命令查看 ping 命令包结构。

ping -c 3 mirrors.cloud.aliyuncs.com

#此时还没有数据包信息,我们需要新开一个终端,执行 ping -c1 mirrors.cloud.aliyuncs.com 就能看到以下输出:
ping -c1 mirrors.cloud.aliyuncs.com
sudo tcpdump -nnvXSs 0 -c2 icmp

TCP/IP 网络协议基础入门_第12张图片
TCP/IP 网络协议基础入门_第13张图片
TCP/IP 网络协议基础入门_第14张图片
第一个数据报就是 ICMP 回显请求报文,是主机 192.168.42.3 发送给 100.100.2.148 的,第二个数据报是 ICMP 回显应答报文,是 100.100.2.148 发给本机 192.168.42.3 的。

TTL 值

TTL 是 Time To Live 的缩写,该字段指定 IP 包被路由器丢弃之前允许通过的最大网段数量。可以去回顾一下上节的 IP 报文结构图。

TTL 是 IPv4 包头的一个 8 bit 字段,它的作用是限制 IP 数据包在计算机网络中的存在时间,即 IP 数据包在计算机网络中可以转发的最大条数。

假如没有 TTL 字段,网络中的 IP 包将越来越多造成网络阻塞,TTL 避免 IP 包在网络中的无限循环和收发,节省了网络资源,并能使 IP 包的发送者能收到告警消息。

Ping 命令判断操作系统

ping 命令会返回一个 TTL 值,我们可以使用它来判断目标的操作系统类型。 常见操作系统缺省 TTL 值如下:

  • UNIX TTL: 255;
  • Linux TTL: 64;
  • WINDOWS 95/98 TTL: 32;
  • Windows NT 4.0/2000/XP/2003/7/8/10 TTL:128。

此方法主要用于粗略的判断,想更加准确的获取服务器操作系统信息请学习实验楼的 NMAP 相关课程。

traceroute 程序

ping 程序和 traceroute 程序是两个常见的基于 ICMP 协议的工具。

traceroute

traceroute 程序是用来侦测主机到目的主机之间所经路由情况的重要工具。刚才 ping 程序中讲过,带 -R 参数的 ping 命令也可以记录路由过程,但是因为 IP 数据报头的长度限制(最多能保存 9 个 IP 地址),ping 不能完全的记录下所经过的路由器,traceroute 正好就填补了这个缺憾。

traceroute 工作原理

  • 它发送一份 TTL 为 1 的 IP 数据报给目的主机,经过第一个路由器时,TTL 值被减为 0,则第一个路由器丢弃该数据报,并返回一份超时 ICMP 报文,于此得到了路径中第一个路由器的地址;
  • 然后再发送一份 TTL 值为 2 的数据报,便可得到第二个路由器的地址;
  • 以此类推,一直到到达目的主机为止,这样便记录下了路径上所有的路由 IP。

尝试追踪到 www.github.com 的路由:

traceroute -n www.github.com

查看路由表:

route -n

IGMP

IGMP 是用于管理多播组成员的一种协议,它的作用在于:让其它所有需要知道自己处于哪个多播组的主机和路由器知道自己的状态。只要某一个多播组还有一台主机,多播路由器就会把数据传输出去,这样接受方就会通过网卡过滤功能来得到自己想要的数据。

为了知道多播组的信息,多播路由器需要定时的发送 IGMP 查询,各个多播组里面的主机要根据查询来回复自己的状态。路由器来决定有几个多播组,自己要对某一个多播组发送什么样的数据。

5、传输层:UDP协议

从之前介绍的网络层协议来看,通信的两端是两台主机,IP 数据报首部就标明了这两台主机的 IP 地址。但是从传输层来看,是发送方主机中的一个进程与接收方主机中的一个进程在交换数据,因此严格地讲,通信双方不是主机,而是主机中的进程。

传输层协议

主机中常常有多个应用进程同时在与外部通信(比如你的浏览器和 QQ 在同时运行),下图中,A 主机的 AP1 进程在与 B 主机的 AP3 进程通信,同时主机 A 的 AP2 进程也在与 B 主机的 AP4 进程通信。

两个主机的传输层之间有一个灰色双向箭头,写着“传输层提供应用进程间的逻辑通信”。

逻辑通信:看起来数据似乎是沿着双向箭头在传输层水平传输的,但实际上是沿图中的虚线经多个协议层次而传输。

TCP/IP 网络协议基础入门_第15张图片

TCP/IP 协议栈传输层有两个重要协议——UDP 和 TCP,不同的应用进程在传输层使用 TCP 或 UDP 之一。

端口

在第一节我们已经了解过端口的概念,端口的作用体现在传输层。

刚才的图中,AP1 与 AP3 的通信与 AP2 与 AP4 的通信可以使用同一个传输层协议来传输(TCP 或 UDP),根据 IP 地址或 MAC 地址都只能把数据传到正确的主机,但具体需要传到哪一个进程,是通过端口来辨认的。

比如同时使用浏览器和 QQ,浏览器占用 80 端口,而 QQ 占用 4000 端口,那么发送过来的 QQ 消息便会通过 4000 端口显示在 QQ 客户端,而不会错误地显示在浏览器上。

端口号有 0 ~ 65535 的编号,其中:

  • 编号 0 ~ 1023 为 系统端口号 ,这些端口号可以在网址 www.iana.org 查询到,它们被指派给了 TCP/IP 最重要的一些应用程序,以下是一些常见的系统端口号:
应用层协议: FTP TELNET SMTP DNS TFTP HTTP SNMP
系统端口号: 21 23 25 53 69 80 161
  • 编号 1024 ~ 49151 为登记端口号,为没有系统端口号的应用程序使用,使用这类端口号必须在 IANA 按规定手续登记,以防止重复。
  • 编号 49152 ~ 65535 为短暂端口号,是留给客户进程选择暂时使用的,使用结束后,这类端口号会被放开以供其它程序使用。

下面使用 netstat -luant 命令列出了监听中的端口:
TCP/IP 网络协议基础入门_第16张图片

UDP 概述

UDP(User Datagram Protocol)用户数据报协议,它只在 IP 数据报服务之上增加了很少一点功能,它的主要特点有:

  • UDP 是无连接的,发送数据之前不需要建立连接(而 TCP 需要),减少了开销和时延。
  • UDP尽最大努力交付,不保证交付可靠性
  • UDP 是面向报文的,对于从应用层交付下来的 IP 数据报,只做很简单的封装(8 字节 UDP 报头),首部开销小。
  • UDP 没有拥塞控制,出现网络拥塞时发送方也不会降低发送速率。这种特性对某些实时应用是很重要的,比如 IP 电话,视频会议等,它们允许拥塞时丢失一些数据,因为如果不抛弃这些数据,极可能造成时延的累积。
  • UDP 支持一对一、一对多、多对一和多对多的交互通信。

从应用层到传输层,再到网络层的各层次封装:

TCP/IP 网络协议基础入门_第17张图片

UDP 报文

UDP 数据报可分为两部分:UDP 报头和数据部分。其中数据部分是应用层交付下来的数据。UDP 报头总共 8 字节,而这 8 字节又分为 4 个字段:

TCP/IP 网络协议基础入门_第18张图片

  • 源端口:2 字节,在对方需要回信时可用,不需要时可以全 0;

  • 目的端口:2 字节,必须,也是最重要的字段;

  • 长度:2 字节,长度值包括报头和数据部分;

  • 校验和:2 字节,用于检验 UDP 数据报在传输过程中是否有出错,有错就丢弃。

tcpdump 抓取 UDP 报文

  • 我们需要一个小程序,用于向指定 IP 地址的指定端口发送一个 指定内容 的 UDP 数据报,这个程序已经编写好,依次输入以下命令,下载并编译:
wget http://labfile.oss.aliyuncs.com/courses/98/test.c
gcc -o test test.c

这个 C 程序会向 IP 地址 192.168.1.1 的 7777 端口发送一条 "hello" 消息。你可以用编辑器修改程序,向不同的 IP 发送不同的内容。

  • 新开一个终端,输入以下命令运行刚才编译好的 C 程序 test,并运行 tcpdump::
./test
sudo tcpdump -vvv -X udp port 7777
  • test 程序运行结束,返回刚才运行 tcpdump 的终端查看抓包结果:
    TCP/IP 网络协议基础入门_第19张图片
    蓝色框为 16 进制目的端口,绿色框为 16 进制目的 IP,红色框为 20 字节 IP 报头,橘色下划线为 8 字节 UDP 报头,红色下划线为 hello 的 ASCII 码。

从 4500 到 0101 都是 IP 报头,IP 报文在之前已经讲过,这里就不赘述了。后面的部分就是 UDP 报文。

我们知道 UDP 报头一共 8 字节,所以从 eb39 到 ac82 是 UDP 报头的部分。

  • eb39:源端口,2 字节,换成十进制也就是 32830
  • 1e61:目的端口,2 字节,十进制为 7777
  • 001c:包长度,单位为字节,换为十进制可知包长度为 28 字节
  • ac82:校验和
  • 后面的就是数据内容的 ASCII 码。

6、传输层:TCP协议

TCP的三次握手与四次挥手理解及面试题(很全面)

TCP 和 UDP 处在同一层——传输层,但是它们有很多的不同。TCP 是 TCP/IP 系列协议中最复杂的部分,它具有以下特点:

  • TCP 提供 可靠的 数据传输服务,TCP 是 面向连接的 。应用程序在使用 TCP 通信之前,先要建立连接,这是一个类似“打电话”的过程,通信结束后还要“挂电话”。
  • TCP 连接是 点对点 的,一条 TCP 连接只能连接两个端点。
  • TCP 提供可靠传输,无差错、不丢失、不重复、按顺序。
  • TCP 提供 全双工 通信,允许通信双方任何时候都能发送数据,因为 TCP 连接的两端都设有发送缓存和接收缓存。
  • TCP 面向 字节流 。TCP 并不知道所传输的数据的含义,仅把数据看作一连串的字节序列,它也不保证接收方收到的数据块和发送方发出的数据块具有大小对应关系。

使用 netstat -s 查看数据包统计信息:

以下截图截取 tcp 部分
TCP/IP 网络协议基础入门_第20张图片
截图中每行所表示含义依次是:主动开放的连接数被动开放的连接数失败的连接尝试重置连接数当前连接数接收的 分段数发送的分段数重新传输的分段数

TCP 报文段结构

TCP 是面向字节流的,而 TCP 传输数据的单元是 报文段 。一个 TCP 报文段可分为两部分:报头和数据部分。数据部分是上层应用交付的数据,而报头则是 TCP 功能的关键。

TCP 报文段的报头有前 20 字节的固定部分,后面 4n 字节是根据需要而添加的字段。如图则是 TCP 报文段结构:

TCP/IP 网络协议基础入门_第21张图片
与IP数据包对比:
TCP/IP 网络协议基础入门_第22张图片
20 字节的固定部分,各字段功能说明:

  • 源端口和目的端口:各占 2 个字节,分别写入源端口号和目的端口号。这和 UDP 报头有类似之处,因为都是传输层协议。
  • 序号seq:占 4 字节序,序号范围[0,232-1],序号增加到 232-1 后,下个序号又回到 0。TCP 是面向字节流的,通过 TCP 传送的字节流中的每个字节都按顺序编号,而报头中的序号字段值则指的是本报文段数据的第一个字节的序号
  • 确认序号ack:占 4 字节,期望收到对方下个报文段的第一个数据字节的序号。
  • 数据偏移:占 4 位,指 TCP 报文段的报头长度,包括固定的 20 字节和选项字段。
  • 保留:占 6 位,保留为今后使用,目前为 0。
  • 控制位:共有 6 个控制位,说明本报文的性质,意义如下:
    • URG 紧急:当 URG=1 时,它告诉系统此报文中有紧急数据,应优先传送(比如紧急关闭),这要与紧急指针字段配合使用。
    • ACK 确认:仅当 ACK=1 时确认号字段才有效。建立 TCP 连接后,所有报文段都必须把 ACK 字段置为 1。
    • PSH 推送:若 TCP 连接的一端希望另一端立即响应,PSH 字段便可以“催促”对方,不再等到缓存区填满才发送。
    • RST复位:若 TCP 连接出现严重差错,RST 置为 1,断开 TCP 连接,再重新建立连接。
    • SYN 同步:用于建立和释放连接,稍后会详细介绍
    • FIN 终止:用于释放连接,当 FIN=1,表明发送方已经发送完毕,要求释放 TCP 连接
  • 窗口:占 2 个字节。窗口值是指发送者自己的接收窗口大小,因为接收缓存的空间有限。
  • 检验和:2 个字节。和 UDP 报文一样,有一个检验和,用于检查报文是否在传输过程中出差错。
  • 紧急指针:2 字节。当 URG=1 时才有效,指出本报文段紧急数据的字节数。
  • 选项:长度可变,最长可达 40 字节。具体的选项字段,需要时再做介绍。

我们下面再用 tcpdump 命令试着抓取一下。

sudo tcpdump -ntx -C 1

TCP/IP 网络协议基础入门_第23张图片
其实输出结果中还包含着 TCP 协议的报文,试着回顾一下,相信你能很快找到哪部分是 IP 协议的首部。IP 报文头紧接着的一部分就是 TCP 报文头,从 170d 开始。

  • 源端口:0x170d,转换为十进制为 5901。

  • 目的端口:0x9d86,即为 40326。

  • 序号:0xba42 638b,即为 3124913035,这和图中开头的 seq 是一致的。

  • 确认序号:0x4c1a d749,即为 1276827465,这和图中开头的 ack 是一致的。

  • 数据偏移:0x8,8*4=32B。

  • 其他可依次类推。

连接的建立与释放

刚才说过,TCP 是面向连接的,在传输 TCP 报文段之前先要创建连接,发起连接的一方被称为客户端,而响应连接请求的一方被称为服务端,而这个创建连接的过程被称为三次握手
TCP/IP 网络协议基础入门_第24张图片

  • 客户端发出请求连接报文段,其中报头控制位 (同步标志位)SYN=1,初始序号 seq=x。客户端进入 SYN-SENT(同步已发送)状态。
  • 服务端收到请求报文段后,向客户端发送确认报文段。确认报文段的首部中 (同步标志位)SYN=1,(确认标志位)ACK=1,确认号是 ack=x+1,同时为自己选择一个初始序号 seq=y。服务端进入 SYN-RCVD(同步收到)状态。
  • 客户端收到服务端的确认报文段后,还要给服务端发送一个确认报文段。这个报文段中 ACK=1,确认号 ack=y+1,而自己的序号 seq=x+1。这个报文段已经可以携带数据,如果不携带数据则不消耗序号,则下一个报文段序号仍为 seq=x+1。

至此 TCP 连接已经建立,客户端进入 ESTABLISHED(已建立连接)状态,当服务端收到确认后,也进入 ESTABLISHED 状态,它们之间便可以正式传输数据了。

当传输数据结束后,通信双方都可以释放连接,这个释放连接过程被称为释放连接四次挥手:
TCP/IP 网络协议基础入门_第25张图片

  • 此时 TCP 连接两端都还处于 ESTABLISHED 状态,客户端停止发送数据,并发出一个 FIN 报文段。首部 FIN=1,序号 seq=u(u 等于客户端传输数据最后一字节的序号加 1)。客户端进入 FIN-WAIT-1(终止等待 1)状态。
  • 服务端回复确认报文段,确认号 ack=u+1,序号 seq=v(v 等于服务端传输数据最后一字节的序号加 1),服务端进入 CLOSE-WAIT(关闭等待)状态。现在 TCP 连接处于半开半闭状态,服务端如果继续发送数据,客户端依然接收。
  • 客户端收到确认报文,进入 FIN-WAIT-2 状态,服务端发送完数据后,发出 FIN 报文段,FIN=1,确认号 ack=u+1,然后进入 LAST-ACK(最后确认)状态。
  • 客户端回复确认报文段,ACK=1,确认号 ack=w+1(w 为半开半闭状态时,收到的最后一个字节数据的编号) ,序号 seq=u+1,然后进入 TIME-WAIT(时间等待)状态。

注意此时连接还没有释放,需要时间等待状态结束后(4 分钟)连接两端才会 CLOSED。设置时间等待是因为,有可能最后一个确认报文丢失而需要重传。

我们使用 tcpdump 命令抓包来理解握手过程。首先在终端输入如下命令:

sudo tcpdump -S host 192.168.42.3 and 115.29.233.149

注意:此处的 192.168.42.3 要根据你自己的环境修改,为内网 ip,可以通过 ifconfig eth0 查看。115.29.233.149 是实验楼的网址,需要通过 nslookup www.shiyanlou 命令查询最新的 IP 地址。

命令目的为抓取本机到 www.shiyanlou.com 的数据包;
-S 参数的目的是获得 ack 的绝对值。

然后使用浏览器访问 www.shiyanlou.com。再回到终端,可以看到如下输出:
TCP/IP 网络协议基础入门_第26张图片
输出中展示了三次握手的过程。红色为第一次,黄框是第二次,绿框是第三次,试着根据上面介绍的握手过程来对照 seq 和 ack 值的变化。

TCP 可靠传输的实现

  • TCP 报文段的长度可变,根据收发双方的缓存状态、网络状态而调整。
  • 当 TCP 收到发自 TCP 连接另一端的数据,它将发送一个确认。
  • 当 TCP 发出一个报文段后,它启动一个定时器,等待目的端确认收到这个报文段,如果不能及时收到一个确认,将重发这个报文段。这就是稍后介绍的超时重传。
  • TCP 将保持它首部和数据的检验和。如果通过检验和发现报文段有差错,这个报文段将被丢弃,等待超时重传。
  • TCP 将数据按字节排序,报文段中有序号,以确保顺序的正确性。
  • TCP 还能提供流量控制。TCP 连接的每一方都有收发缓存。TCP 的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。

可见超时重发机制是 TCP 可靠性的关键,只要没有得到确认报文段,就重新发送数据报,直到收到对方的确认为止。

超时重传

TCP 规定,接收者收到数据报文段后,需回复一个确认报文段,以告知发送者数据已经收到。而发送者如果一段时间内(超时计时器)没有收到确认报文段,便重复发送。

为了实现超时间重传,需要注意:

  • 发送者发送一个报文段后,暂时保存该报文段的副本,为发生超时重传时使用,收到确认报文后删除该报文段。
  • 确认报文段也需要序号,才能明确是发出去的哪个数据报得到了确认。
  • 超时计时器比传输往返时间略长,但具体值是不确定的,根据网络情况而变。

连续 ARQ 协议

也许你也发现了,按上面的介绍,超时重传机制很费时间,每发送一个数据报都要等待确认。

在实际应用中的确不是这样的,真实情况是,采用了流水线传输:发送方可以连续发送多个报文段(连续发送的数据长度叫做窗口),而不必每发完一段就停下来等待确认。

实际应用中,接收方也不必对收到的每个报文都做回复,而是采用累积确认方式:接收者收到多个连续的报文段后,只回复确认最后一个报文段,表示在这之前的数据都已收到。

这样,传输效率得到了很大的提升。
TCP/IP 网络协议基础入门_第27张图片

流量控制和拥塞控制

由于接收方缓存的限制,发送窗口不能大于接收方接收窗口。在报文段首部有一个字段就叫做窗口(rwnd),这便是用于告诉对方自己的接收窗口,可见窗口的大小是可以变化的。

那么窗口的大小是如何变化的呢?TCP 对于拥塞的控制总结为“慢启动、加性增、乘性减”,如图所示:
TCP/IP 网络协议基础入门_第28张图片

  • 慢启动 :初始的窗口值很小,但是按指数规律渐渐增长,直到达到慢开始门限(ssthresh)。
  • 加性增 :窗口值达到慢开始门限后,每发送一个报文段,窗口值增加一个单位量。
  • 乘性减 :无论什么阶段,只要出现超时,则把窗口值减小一半。

tcpdump 抓取 TCP 报文段

上一节实验,我们用 tcpdump 抓取并阅读了 UDP 报文,那么这次我们尝试抓取 TCP 报文段。

  • 针对这次实验,需要下载对应的代码文件,是基于 TCP 的聊天小程序,分为 server(服务端—)和 client(客户端):
wget http://labfile.oss.aliyuncs.com/courses/98/client.c
wget http://labfile.oss.aliyuncs.com/courses/98/server.c
gcc -o server server.c
gcc -o client client.c
  • 编译完成后先不要运行,先打开 tcpdump,使用命令安装并运行 tcpdump:
sudo apt-get update
sudo apt-get install tcpdump
sudo tcpdump -vvv -X -i lo tcp port 7777

新开一个终端,运行 server 程序:

./server 127.0.0.1

然后再新开第三个终端,运行 client 程序:

./client 127.0.0.1

现在,使用 client 和 server 聊天,轮流互发几条简短的消息(比如 hello、hi、wei 之类的)便可以关闭 client 和 server,回到运行 tcpdump 的终端查看抓取的报文段内容:
TCP/IP 网络协议基础入门_第29张图片
通过抓取的报文,还可以清晰的看到建立连接三次握手和断开连接四次握手的过程。

7、应用层协议

应用层协议(application layer protocol)定义了运行在不同端系统上的应用程序进程如何相互传递报文。接下来我们就来学习应用层上的一些协议。

DNS 协议

DNS(Domain Name Service 域名服务)协议基于 UDP,使用端口号 53。

由数字组成的 IP 地址很难记忆,所以我们上网使用网站 IP 地址的别名——域名。实际使用中,域名与 IP 地址是对应的,这种对应关系保存在DNS 服务器之中。

在浏览器中输入一个域名后,会有 DNS 服务器将域名解析为对应的 IP 地址。注意这和网络层的 ARP 协议的不同之处:DNS 提供的是域名与 IP 地址的对应关系,而 ARP 提供的是 IP 地址和 MAC 地址的对应关系。

DNS 服务器

DNS 服务器是个分层次的系统:

  • 根 DNS 服务器 :全世界共有 13 台根域名服务器,编号 A 到 M,其中大部分位于美国。
  • 顶级(TLD)DNS 服务器 :负责如 com、org、edu 等顶级域名和所有国家的顶级域名(如 cn 、uk 、jp)。
  • 权威 DNS 服务器 :大型组织、大学、企业的域名解析服务。
  • 本地 DNS 服务器 :通常与我们主机最近的 DNS 服务器。

而域名解析的过程,有迭代查询和递归查询两种方式:
TCP/IP 网络协议基础入门_第30张图片

host 命令

在 linux 系统中,可以用 host 命令进行 DNS 查询,查看一个指定域名的 IP,比如要查询 mirrors.aliyuncs.com 的 IP 地址:

host mirrors.aliyuncs.com

DNS 报文

主机向 DNS 服务器发出的查询叫做DNS 报文,问答报文的内容,都是 IP 和域名的对应信息,问题中包含域名,类型,类信息,回答中包含指针,类型,类,TTL,长度,IP 地址信息。

DNS 缓存和 hosts 文件

之前 DNS 解析查询过程的图中,共发出了 8 份 DNS 报文,这是非常消耗时间的,所以实际应用上使用 DNS 缓存 :当一个 DNS 服务器接收到一个 DNS 回答后,会将其信息缓存一段时间,当再有一个对相同域名的查询时,便可直接回复。

通过 DNS 缓存,其实很多查询都只需要本地 DNS 服务器便可完成。

我们可以用 dig 命令进行域名查询:

# 查询 www.shiyanlou.com 的 ip 地址,+noedns 是不显示 edns 信息
dig www.shiyanlou.com +noedns

输出信息解析:

# 这一部分为应答的统计信息
# - QUERY:查询任务个数,这里为 1 个
# - ANSWER:查询到几条 A 记录(IP 地址),这里为 1 条
# - AUTHORITY:几个权威域名服务器,这里为 0 个
# - ADDITIONAL:几个附加信息,这里为 0 个
; <<>> DiG 9.9.5-3ubuntu0.8-Ubuntu <<>> www.shiyanlou.com +noedns
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28554
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0


# 这一部分为问题片段,意思是查询 www.shiyanlou.com 的 A 记录
;; QUESTION SECTION:
;www.shiyanlou.com.        IN    A

# 这一部分为应答片段,意为查询到的 IP 为 115.29.233.149
;; ANSWER SECTION:
www.shiyanlou.com.    43200    IN    A    115.29.233.149

# 这一部分为查询的任务统计信息,比如查询花了多少时间,执行查询的时间等
;; Query time: 8 msec
;; SERVER: 100.100.2.138#53(100.100.2.138)
;; WHEN: Sun Feb 03 17:37:46 CST 2019
;; MSG SIZE  rcvd: 51

我们下面用 tcpdump 来捕获 DNS。首先执行命令

sudo tcpdump -nt udp port 53

53 端口是 DNS 服务器所开放的端口

这个时候并没有什么捕获信息,因为我们还没有开始 DNS 查询。可以使用 host 命令进行域名查询,我们新开一个终端标签执行:

host www.shiyanlou.com

回到之前的标签,可以看到 tcpdump 命令的输出:
TCP/IP 网络协议基础入门_第31张图片
我们来看第一个数据包,是由本机向首选 DNS 服务器 8.8.8.8 的 53 端口发送的 DNS 查询报文。1943 是查询报文的标识值。+ 代表启用递归查询标志。A? 表示使用 A 类型的查询方式。www.shiyanlou.com 为查询的域名。35 代表 DNS 查询报文的长度为 35 字节。

第二个数据包为应答报文,可以看出标识值和第一个报文的标识值是一样的,1/0/0 表示报文包含 1 个应答资源记录,0 个授权资源记录,0 个额外信息记录。51 代表应答报文的长度为 51 字节。

同理可得出后续报文所代表的含义。

我们还可以使用如下命令查看以十六进制输出的报文内容:

sudo tcpdump -nn -vvv -X udp port 53

TCP/IP 网络协议基础入门_第32张图片
我们来看第一个数据报,呈现的报文内容实际上是 IP 数据报,包含了 IP 首部,UDP 首部和 DNS 报文,根据之前的学习我们知道 IP 首部是 20 字节,也就是 4500 到 0808 的部分,UDP 首部是 8 字节,也就是 b4e9 到 faf8 的部分。剩下的也就是 DNS 请求报文,一共 35 字节,与括号中的 35 是吻合的。同理可解析其他报文信息。

FTP 协议

FTP(File Transfer Protocol 文件传输协议)基于 TCP,使用端口号 20(数据)和 21(控制)。

它的主要功能是减少或消除在不同操作系统下处理文件的不兼容性,以达到便捷高效的文件传输效果。

  • FTP 只提供文件传输的基本服务,它采用 客户端—服务器 的方式,一个 FTP 服务器可同时为多个客户端提供服务。
  • 在进行文件传输时,FTP 的客户端和服务器之间会建立两个 TCP 连接:21 号端口建立控制连接,20 号端口建立数据连接。
  • FTP 的传输有两种方式:ASCII 传输模式和二进制数据传输模式。

我们直接下载一个 FTP 报文信息示例包 ftp.pcap,然后用 tcpdump 解析。

# 下载 ftp.pcap 文件
wget http://labfile.oss.aliyuncs.com/courses/98/ftp.pcap

# 用 tcpdump 命令解析
sudo tcpdump -r ftp.pcap

TCP/IP 网络协议基础入门_第33张图片
前面三帧是客户端与服务器的三次握手,连接服务端的 ftp 端口(21),客户端 ip 是 192.168.0.114,服务端 ip 是 192.168.0.193:

01:24:40.499548 IP 192.168.0.114.1137 > 192.168.0.193.ftp: Flags [S], seq 3753095934, win 16384, options [mss 1460,nop,nop,sackOK], length 0
01:24:40.501867 IP 192.168.0.193.ftp > 192.168.0.114.1137: Flags [S.], seq 3334930753, ack 3753095935, win 16384, options [mss 1452,nop,nop,sackOK], length 0
01:24:40.501886 IP 192.168.0.114.1137 > 192.168.0.193.ftp: Flags [.], ack 1, win 17424, length 0

第四帧是服务器向客户端发送相关信息:

01:24:40.503947 IP 192.168.0.193.ftp > 192.168.0.114.1137: Flags [P.], seq 1:31, ack 1, win 65535, length 30

此时控制连接建立完成。再下面的部分就是客户端向服务器端发送请求,然后服务器端响应客户端的过程,比如登录,输出所在路径等操作。

在后面的输出中,还能找到客户端与服务器端建立数据连接时三次握手的过程。

我们这里看到服务器端开放端口号不是 20 是因为 FTP 的工作模式是被动模式(PASV),被动模式中,服务端会创建一个新的随机的非特权端口 P(P> = 1023)与客户端建立数据通道连接。

HTTP 协议

HTTP (HyperText Transfer Protocol 超文本传输协议) 基于 TCP,使用端口号 80 或 8080。

每当你在浏览器里输入一个网址或点击一个链接时,浏览器就通过 HTTP 协议将网页信息从服务器提取再显示出来,这是现在使用频率最大的应用层协议。

这个原理很简单:

  • 点击一个链接后,浏览器向服务器发起 TCP 连接;
  • 连接建立后浏览器发送 HTTP 请求报文,然后服务器回复响应报文;
  • 浏览器将收到的响应报文内容显示在网页上;
  • 报文收发结束,关闭 TCP 连接。

HTTP 报文会被传输层封装为 TCP 报文段,然后再被 IP 层封装为 IP 数据报。

HTTP 请求报文结构:
TCP/IP 网络协议基础入门_第34张图片
HTTP 响应报文结构:
TCP/IP 网络协议基础入门_第35张图片
可见报文分为 3 部分:

  • 开始行:用于区分是请求报文还是响应报文,请求报文中开始行叫做请求行,而响应报文中,开始行叫做状态行。在开始行的三个字段之间都用空格分开,结尾处 CRLF 表示回车和换行。
  • 首部行:用于说明浏览器、服务器或报文主体的一些信息。
  • 实体主体:请求报文中通常不用实体主体。

请求报文的方法字段是对所请求对象进行的操作,而响应报文的状态码是一个 3 位数字,分为 5 类 33 种:

  • 1xx:通知信息,如收到或正在处理。
  • 2xx:成功接收。
  • 3xx:重定向。
  • 4xx:客户的差错,如 404 表示网页未找到。
  • 5xx:服务器的差错,如常见的 502 Bad Gateway。

我们可以通过浏览器的开发者工具来查看状态码,首先使用浏览器访问 www.shiyanlou.com ,然后通过如下图所示打开浏览器控制台,然后刷新页面,在网络标签里我们可以看到对应资源的获取状态码。
TCP/IP 网络协议基础入门_第36张图片
我们随意点击一个记录,然后点击消息头即可看到消息头的信息:

开发者工具对消息做了一些处理,使输出更为易读,如果我们想查看原始头的信息,可以点击原始头按钮。

可以看到消息的请求头和响应头,请求头里包含请求的网址,请求方法,协议版本等。响应头里包含了消息类型,编码,时间等信息。

Telnet 协议

Telnet 简介

Telnet 协议是 TCP/IP 协议族中的一员,是 Internet 远程登录服务的标准协议和主要方式,它基于 TCP 协议,使用端口 23。

终端使用者在本地电脑上使用 telnet 程序,用它连接到服务器,终端使用者可以在 telnet 程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。

Telnet 工作过程

使用 Telnet 协议进行远程登录时必须满足以下条件:

  • 在本地计算机上必须装有包含 Telnet 协议的客户程序;
  • 必须知道远程主机的 IP 地址或域名;
  • 必须知道登录标识与口令。

Telnet 远程登录服务分为以下 4 个过程:

  • 本地与远程主机建立连接。该过程实际上是建立一个 TCP 连接,用户必须知道远程主机的 IP 地址或域名;
  • 将本地终端上输入的用户名和口令及以后输入的任何命令或字符以 NVT ( Net Virtual Terminal ) 格式传送到远程主机。该过程实际上是从本地主机向远程主机发送一个 IP 数据包;
  • 将远程主机输出的 NVT 格式的数据转化为本地所接受的格式送回本地终端,包括输入命令回显和命令执行结果;
  • 最后,本地终端对远程主机进行撤消连接。该过程是撤销一个 TCP 连接。

Telnet 连接远程主机

telnet 使用语法:telnet IP 端口(可选)

shiyanlou:~/ $ telnet 127.0.0.1 22
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.8

Telnet 连接远程主机

telnet 可以测试目标机器的 TCP 端口是否开放。

例如 telnet IP地址 3389 是用来测试目标机器的 3389 端口是否开放,如果连接失败,可能是以下原因:

  • 防火墙屏蔽
  • 目标机器没有启用相关远程桌面服务(windows)
  • 修改了默认占用 3389 端口。

下图示例使用 telnet 127.0.0.1 端口 测试本地环境端口开放性:
TCP/IP 网络协议基础入门_第37张图片
说明本地环境 3389 端口未开放 ,22 端口开放。

下图示例使用 netstat -pantu 验证以上结果(LISTEN 说明为开放状态):
TCP/IP 网络协议基础入门_第38张图片

TFTP 协议

TFTP( Trivial File Transfer Protocol )是 TCP/IP 协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务,它基于 UDP 协议,使用端口 69 。

此协议设计的时候是进行小文件传输的,与 FTP 相比少了许多功能,它只能从文件服务器上获得或写入文件,不能列出目录,不进行认证。

TFTP 也有着它自身的优点:

  • TFTP 可用于 UDP 环境;比如当需要将程序或者文件同时向许多机器下载时就往往需要使用到 TFTP 协议。
  • TFTP 代码所占的内存较小,这对于小型计算机或者某些特殊用途的设备来说是很重要的,TFTP 具有更多的灵活性,也减少了开销。

TFTP 报文格式

TCP/IP 网络协议基础入门_第39张图片
TFTP 数据报文有 5 种操作码,对应了 5 种报文格式(1、2 报文格式相同):

  • 操作码为 RRQ :读文件请求,客户端请求读取位于服务器上的文件;
  • 操作码为 WRQ :写文件请求,客户端请求写入位于服务器上的文件;
  • 操作码为 DATA :数据包,用于传输数据文件;
  • 操作码为 ACK :确认包,回应确认信息;
  • 操作码为 ERROR :错误包,它用于服务器不能处理读请求或者写请求的情况。

SMTP 协议和 POP3 协议

SMTP 简介

SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式,它使用 TCP 协议,使用端口 25。

SMTP 存在两个端:

  • 在发信人的邮件服务器上执行的客户端;
  • 在收信人的邮件服务器上执行的服务器端。

SMTP 的客户端和服务器端同时运行在每个邮件服务器上。当一个邮件服务器在向其它邮件服务器发送邮件消息时,它是作为 SMTP 客户在运行。

SMTP 的连接和发送过程

  • 建立 TCP 连接
  • 客户端向服务器发送 HELO 命令以标识发件人自己的身份,然后客户端发送 MAIL 命令
  • 服务器端以 OK 作为响应,表示准备接收
  • 客户端发送 RCPT 命令
  • 服务器端表示是否愿意为收件人接收邮件
  • 协商结束,发送邮件,用命令 DATA 发送输入内容
  • 结束此次发送,用 QUIT 命令退出

SMTP 协议详解及工作过程

POP3 简介

POP3(Post Office Protocol Version 3 )即邮局协议版本 3,是 TCP/IP 协议族中的一员 ,主要用于支持使用客户端远程管理在服务器上的电子邮件,使用 TCP 协议,使用端口 110 。

POP3 邮件服务器大都可以“只下载邮件,服务器端并不删除”,也就是改进的 POP3 协议。

POP3 工作过程

  • 用户运行用户代理(如 Foxmail, Outlook Express)
  • 用户代理(以下简称客户端)与邮件服务器(以下简称服务器端)的 110 端口建立 TCP 连接
    客户端向服务器端发出各种命令,来请求各种服务(如查询邮箱信息,下载某封邮件等)
  • 服务端解析用户的命令,做出相应动作并返回给客户端一个响应
  • 上述的两个步骤交替进行,直到接收完所有邮件转到下一步,或两者的连接被意外中断而直接退出
    用户代理解析从服务器端获得的邮件,以适当地形式(如可读)的形式呈现给用户

(参考邮件服务器之 POP3 协议分析)

POP3 和 SMTP 协同工作

一封邮件的发送过程:

TCP/IP 网络协议基础入门_第40张图片

  • 通过 smtp 协议连接到 smtp 服务器,然后发一封邮件给 sohu 的 smtp 服务器;
  • 通过 smtp 协议将邮件转投给 sina 的 smtp 服务器(邮件发送服务器);
  • 将接收到的邮件存储到 [email protected] 这个邮件账号分配的存储空间中;
  • 通过 POP3 协议连接到 POP3 服务器收取邮件;
  • [email protected] 账号的存储空间当中取出邮件;
  • POP3 服务器将取出来的邮件回送给 [email protected] 账户。

你可能感兴趣的:(计算机网络)