TCP/IP 网络协议基础入门

1、TCP/IP简介

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

在这里插入图片描述
可见 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 地址:
在这里插入图片描述

域名

用 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)
    在这里插入图片描述
    分用:当主机收到一个数据帧时,数据就从协议层底向上升,通过每一层时,检查并去掉对应层次的报文首部或尾部,与封装过程正好相反。

2、链路层介绍

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

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

数据帧的结构是这样的:
在这里插入图片描述

控制帧的传输

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

差错控制

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

反馈重发

接收方通过对差错编码(奇偶校验码或 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 来取代它。
    图片描述

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 协议就应从学习它的报文字段意义和作用开始。

在这里插入图片描述
如上图所示,普通的 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 将在接受到几个数据包后退出

在这里插入图片描述
首先看到开头的 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 位:
在这里插入图片描述

A 类地址

A 类地址网络号范围:1.0.0.0—127.0.0.0;
A 类 IP 地址范围:1.0.0.0—127.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值