TCP/IP 协议栈

微信搜索“编程笔记本”,获取更多信息
------------- codingbook2020 -------------

前面我们对 ISO/OSI 的 7 层结构进行了简单的介绍,由于 ISO 指定的 OSI 参考模型过于庞大、复杂,在实现时造成了很多困难,从而招致了很多批评。在实际实现中,TCP/IP 协议栈获得了更为广泛的应用,目前主流的操作系统网络协议栈基本上都采用了 TCP/IP 协议栈。

目录

1. TCP/IP 协议栈参考模型

经典的 TCP/IP 参考模型从上至下分为 4 个层次:应用层传输层网络互联层主机到网络层。与 OSI 模型不同的是,在 TCP/IP 参考模型中,根据实际情况将 OSI 参考模型的会话层和表示层合并到应用层中;同时,将 OSI 参考模型中的数据链路层和物理层合并为主机到网络层。TCP/IP 参考模型与 OSI 参考模型的对照参见下图:

图片

实际应用中 TCP/IP 的层次结构如下图所示:

图片

其各层的主要功能如下所述:

  • 主机到网络层
    包括设备和数据链路层的主机到网络层,在 TCP/IP 参考模型中并没有描述着一层的具体实现,只是规定能给其上一层的网络互联层提供访问接口,可以传输 IP 数据包,这一层的具体实现随着网络类型的不同而不同。
  • 网络互联层
    网络互联层是整个 TCP/IP 协议栈的核心。它将数据包进行分组并发往目的主机或网络,为了尽快地发送分组,一个数据包的分组可能要经过不同的路径进行传递。这构成了分组之间达到目的网络或者主机的顺序不是原来发送分组的顺序,需要在本层对分组进行排序。网络互联层又常被称为 IP 层。网络互联层的功能有路由网际互联拥塞控制等。
  • 传输层
    传输层的功能是提供源主机和目标主机上的对等层之间能够进行会话的机制。在传输层中定义了两种协议:传输控制协议 (transmission control protocol, TCP) 和用户数据报协议 (user datagram protocol, UDP) 。**TCP 协议是一个面向连接的、可靠的协议。**它利用 IP 层的机制在不可靠连接的基础上实现可靠的连接,通过发送窗口控制、超时重发、分包等方法将一台主机发出的字节流发往互联网上的其他主机。**UDP 协议是一个不可靠的、无连接协议。**主要适用于不怕数据丢失、不需要对报文进行排序、流量控制的场景。
  • 应用层
    TCP/IP 参考模型中把 OSI 参考模型中的会话层和表示层取消,其功能被合并到应用层。基于 TCP 和 UDP 实现了很多的应用层协议,如基于 TCP 协议的文件传输协议 (file transfer protocol, FTP) 、Telnet 协议超文本链接协议 (hyper text transfer protocol, HTTP) 等;基于 UDP 的协议有简化的 FTP 协议 TFTP网络管理协议 SNMP域名服务 DNS网络文件共享 NFSSAMBA 等;以及两种协议均有实现的协议,例如目前应用十分广泛的多种 P2P 协议(BitTorrent、eMule 等)。

2. 主机到网络层协议

通常情况下,主机到网络层的协议对应于 OSI 的数据链路层,对于硬件及其驱动层 TCP/IP 没有进行规范。由 TCP/IP 的 4 层结构可以看出,本层主要为 IP 协议和 ARP 协议提供服务发送和接收网络数据报。本层中由于要实现跨网和跨设备的互通,有很多的实现方式,例如串行线路 (Serial Line IP, SLIP) 、点对点 ppp 等。下面我们仅对以太网的实现方式进行简要的介绍。

以太网是由数字设备公司、英特尔公司和 Xerox 公司在 1982 年公布的一个标准,目前 TCP/IP 技术主要基于此标准。它采用一种带冲突检测的载波侦听多路接入的方法进行传输,即 CSMA/CD (Carrier Sense, Multiple Access with Collision Detection) 。
以太网的封包格式如下图所示,在 IP 数据的基础上增加了 14 个字节。

图片

  • 以太网用 48bit (6 字节) 来表示源地址和目的地址。这里的源地址和目的地址指的是硬件地址,例如网卡的 MAC 地址。
  • 在地址后面是 2 个字节的表示类型的字段,例如 0800 表示此帧的数据为 IP 数据,0806 表示此帧为 ARP 请求。
  • 类型字段之后是数据。对于以太网,规定数据段的大小范围是 46~1500 个字节,不足的数据要用空字符填满。例如,ARP 协议的数据格式为 28 个字节,为了符合规范,其后有 18 个字节的占位符用于满足最少 46 字节的要求。

注:数据段的长度有一个最大值,以太网为 1500 ,这个特性称为 MTU ,即最大传输单元。如果 IP 层有一个要传送的数据长度比 MTU 大,在 IP 层数据要进行分片,使得每个片都小于 MTU 。

  • CRC 字段用于对帧内数据进行校验,保证数据传输的正确性,通常由硬件实现。例如,在网卡设备中实现网络数据的 CRC 校验。

3. IP 协议

IP 协议是 TCP/IP 协议中最重要的协议,它为 TCP、UDP、ICMP 等协议提供传输的通路。IP 层的主要目的是提供子网的互联,形成较大的网络,使不同的子网之间能够传输数据。

IP 层主要有如下作用:

  • 数据传送:将数据从一个主机传送到另一个主机
  • 路由选择:根据子网划分和 IP 地址,发送正确的目的主机地址
  • 数据报文的分段:当传送的数据大于 MTU 时,将数据进行分段发送和接收并组装

IP 数据的格式如下图所示,不包含选项字段,其头部的长度为 20 个字节。

图片

详细解释如下:

1. 版本
IP 协议的版本号,长度为 4 位,规定网络所实现的 IP 版本。例如,如果主机位 IPv4 协议,此字段的值为 4 ,而 IPv6 协议的此字段的值为 6 。

2. 首部长度
首部长度指的是 IP 字段除去数据的整个头部的数据长度,以 32 位的字为单位计算。IP 首部的长度以字为增量变化,最短的 IP 头是 20 字节(不包括数据和选项)。因此这个字段最小值是 5 (20 字节为 160 位,160 位 / 32位 = 5),也就是 5 个32 位字长。由于它是一个 4 位的字段,所以 IP 首部最长为 60 个字节(15 个字乘以 4)。

3. 服务类型 (TOS)
IP 的服务类型字段长度为 8 位。此字段包含 3 位的优先权(现在已忽略),4 位的 T 服务类型子字段和 1 位的保留位(必须置 0)。4 位的服务类型分别为最小延迟(D)、最大吞吐量(T)、最高可靠性(R)、最小费用(F)。这 4 个位中最多只用一个位置 1 ,如果全为 0 ,表示为一般服务。服务类型的具体含义参见下标:

图片

  • 优先权字段 3 位,因此可以有 0~7 的值(0 为正常值,7 为网络控制,此字段目前已经被忽略)。它允许传输站点的应用程序设定向 IP 层发送数据报文的优先权。该字段与 D、T、R、F 相结合,确定采用何种路由方式。
  • D 字段为 1 个 b 长度,当值为 1 时表示请求低时延
  • T 字段为 1 个 b 长度,当值为 1 时表示请求高吞吐量
  • R 字段为 1 个 b 长度,当值为 1 时表示请求高可靠性
  • F 字段为 1 个 b 长度,当值为 1 时表示请求低费用

例如,如果 IP 分组有两个以上的路由方式可进行选择,路由器读取这字段的值,根据服务类型的设置情况来选择一个合适的路由。服务类型字段由应用程序进行设置,路由器尽在必要时进行读取,不进行设置。

4. 总长度
总长度字段的长度是 16 位,表示以字节为单位的数据报文的长度,长度包含 IP 的头部和数据部分。利用头部长度和总长度字段可以计算 IP 数据报文中数据内容的起始地址和长度,由于本字段的长度为 16 位,所以 IP 数据报文最大可达到 65536 个字节的长度。

5. 标识和片偏移
IP 每发一份数据报文都会填写一个标识用来表示此数据包,发送完后此值会加 1 .在 IP 进行分片的时候,将标识复制的 IP 的头部标识数据报文的来源,还要加上分片数据在原数据报文中的偏移地址,便于之后进行组装。利用字段总长度和片偏移可以重新组装 IP 的数据报文。总长度指出原始包的总长度,片偏移指出该包位于正在组装的 IP 报文的偏移量,偏移量从头部开始计算。

6. 生存时间(TTL)
TTL (Time To Live) 字段的值表示数据报文最多可以经过的路由器的数量。它指定数据报文的生存时间,源主机发送数据时设置 TTL(一般为 32 或者 64),经过一个路由器后 TTL 值减 1 。当 TTL 为 0 的时候,路由器丢弃此包,并发送一个 ICMP 报文通知源主机。TTL 的出现是由于在包的传递过程中可能会出现错误情况,引起包在 Internet 的路由器之间不断循环。为防止此类事件发生,因而引入了 TTL 限制报文经过的路由器的数量。

7. 协议类型
该字段为 8 位长度,标识 IP 上承载的时什么高级协议。在封包和解包的过程中,TCP/IP 协议栈知道将数据发给哪个层的协议作相关的处理,协议的值及含义见下图。例如,协议类型为 6 时,网络协议栈知道 IP 上承载的是 TCP 协议,IP 层处理完毕后会交给其上一层协议中 UDP 和 TCP 中的 TCP 协议层进行处理。

图片

8. 校验和
校验和是一个 16 长度的数据,使用循环冗余校验生成,其作用是保证 IP 帧的完整性。发送端发送数据的时候要计算 CRC16 校验值,填入此字段;接收端会计算 IP 的校验值于此字段进行匹配,如果不匹配,表示帧发生错误,将丢弃此报文。在路由的过程中,由于没经过一个路由器都要修改 TTL 的值,所以需要重新计算 CRC16 ,将结果填入此字段中。

9. IP 选项
IP 选项字段是一个 32b 的字段,该选项用来识别 IP 的数据段是正常的数据还是用作网络控制的数据。主要有如下定义:

  • 安全和处理限制
  • 路径记录:记录所经历的路由器的 IP 地址
  • 宽松源站路由:指定数据报文必须经历的 IP 地址,可以经过没有指定的 IP 地址
  • 严格源站路由:指定数据报文必须经历的 IP 地址,不能经过没有指定的 IP 地址

10. 源地址和目的地址
源地址表示发送数据的主机或设备的 IP 地址,目的地址位接收数据的主机或设备的 IP 地址。这两个字段均为 32 长度。字段的目的用于识别 Internet 上的主机。

4. 网际控制报文协议(ICMP)

ICMP 协议用于传递差错信息、时间、回显、网络信息等报文控制数据。

5. 传输控制协议(TCP)

传输控制协议,简称 TCP 协议它在原有 IP 协议的基础上,增加了确认重发、滑动窗口和复用/解复用等机制,提供一种可靠的、面向连接的字节流服务

1. TCP 的特点
TCP 协议的特点如下所述:

  • 字节流的服务:使用 TCP 协议进行传输的应用程序之间传输的数据可视为无结构的字节流,基于字节流的服务没有字节序问题的困扰
  • 面向连接的服务:在数据进行传输之前,TCP 协议需要先建立连接,之后的 TCP 报文在此链接的基础上进行传输
  • 可靠传输服务:基于校验和应答重发机制保证传输的可靠性。接收方对接收到的报文进行校验和计算,如果有误,不发送确认应答,发送方在超时后会自动重发此报文
  • 缓冲传输:缓冲传输可以延迟传送应用层的数据,允许将应用程序需要传送的数据积攒到一定的数量才进行集中发送
  • 全双工传输:各主机 TCP 协议以全双工的方式进行数据流交换
  • 流量控制:TCP 协议的滑动窗口机制,支持主机间的端到端的流量控制

2. TCP 的数据格式
TCP 在 IP 协议的基础上进行传输数据,TCP 数据在 IP 报文中的位置如下图所示:

图片

TCP 数据包含头部和数据两部分,其数据格式如下图所示。主要有端口号目的端口号序列号确认号头部长度控制位窗口尺寸TCP 校验和紧急指针选项等字段。

图片

具体含义如下所述:

  • 源端口和目的端口号:这两个字段均为 16 位的长度,表示发送端和接收端的端口,用于确认发送端和接收端的应用程序。发送端的 IP 地址和端口号及接收端的 IP 地址和端口号可以确认一个在 Internet 上的 TCP 连接
  • 序列号:序列号是一个 32 位长度的字段,表示分配给 TCP 包的编号。序列号用来标识应用程序从 TCP 的发送端到接收端发送的字节流。当 TCP 开始连接的时候,发送一个序列号给接收端,连接成功后,这个序列号作为初始序列号(ISN)。建立连接成功后发送的第一个字节的序列号为 ISN+1 ,之后发送数据 ISN 将按照字节的大小进行递增。序列号是一个 32 位的无符号数,到达 2^32-1 之后从 0 开始
  • 确认号:发送方对发送的首字节进行了编号,当接收方成功接收后,发送回接收成功的序列号加 1 表示确认,发送方再次发送的时候从确认号开始。
  • 头部长度:表示 TCP 头部的长度,由于 TCP 的数据有可选字段,头部长度用于表示头部的长度。此字段的长度为 4 位,表示的是 32 位字长的数据。因此 TCP 的头部最长为 60 个字节,如果没有可选字段通常为 20 个字节
  • 保留位:6 位长度没有使用,必须设为 0
  • 控制位:6 位,用作控制位,可以多个位一起设置,含义见下图

图片

  • 窗口尺寸:窗口尺寸也称接收窗口大小,表示本机上 TCP 协议可以接收的以字节为单位的数目,本字段位 16 位大小
  • 校验和:16 位,用于校验 TCP 传输数据的正误,包括 TCP 头和所有数据,TCP 的数据必须强制校验
  • 紧急指针:16 位,只有设置了 URG 位才有效,它指出了紧接紧急数据的字节的顺序编号
  • 选项:经常使用的为最大分段长度 MSS (Max Segment Size) 。TCP 连接通常在第一个通信的报文中指明这个选项,它指明当前主机所能接收的最大报文长度

3. 建立连接的三次握手
主机 A 和主机 B 要使用 TCP 协议进行通信,需要建立一条 TCP 连接,如下图所示。为了建立一条 TCP 连接,主机 A 和主机 B 需要进行三次通信过程(通常称为”三次握手“,three way handshake)。

图片

  • 主机 A 发送一个 SYN 段到主机 B ,告诉主机 B 想要连接的主机端口以及初识的序列号
  • 主机 B 应答,其中 SYN 段为主机 B 的初始序列号,ACK 段为主机 A 发送的 SYN+1
  • 主机 A 将主机 B 发送的 SYN 段加 1 后作为确认号回给主机 B 作为应答

上面 3 个步骤完成了 TCP 连接的建立,连接建立后,主机 A 和主机 B 之间可以进行 TCP 的数据接收和发送操作了。

4. 释放连接的四次握手
建立一个 TCP 连接需要三次握手,而终止一个 TCP 连接需要四次握手。下图所示为一个主机 A 主动发起的与主机 B 终止 TCP 连接的过程。

图片

  • 主机 A 的 TCP 协议栈发送 FIN 字段,请求释放相应序列号的连接
  • 主机 B 先确认主机 A 的 FIN 请求,确认号为主机 A 序列号加 1
  • 主机 B 发送 FIN 请求
  • 主机 A 对主机 B 的 FIN 请求确认

5. TCP 的封装解封过程
下图所示为使用 TCP 协议的应用程序的数据传输过程,用户数据由主机 A 发送给主机 B ,数据封装在 TCP 的数据部分。

图片

**发送过程是一个封包的过程。**在主机 A 上,在传输层,用户发送的数据增加 TCP 头部,用户数据封装在 TCP 的数据部分。IP 层将数据传输给网络设备的驱动程序,以太网增加头部和尾部后,发送到以太网上。

**接收数据的过程是一个解封包的过程。**在主机 B 上,驱动程序从以太网上接收到数据,然后将数据去除头部和尾部并进行 CRC 校验后,将正确的数据传递给 IP 层。IP 层剥去 IP 头,进行校验,将数据发送给其上层 TCP 层。TCP 则将 TCP 的包头剥去,根据应用程序的标识符判断是否发送给此应用程序。子啊主机 B 上的应用程序会得到干净的有效数据,然后进行处理。

6. 用户数据报文协议(UDP)

UDP 是一种基于 IP 协议的不可靠网络传输协议,在 IP 数据的位置如下图所示:

图片

UDP 协议是 TCP/IP 的传输层协议的一部分,与 TCP 的传输不一样,它提供无连接的、不可靠的传输服务。UDP 协议把应用程序需要传递的数据发送出去,不提供发送数据包的顺序;接收方不向发送方发送接收的确认信息,如果出现丢包或重包的现象,也不会向发送方发送反馈,因此不能保证使用 UDP 协议的程序发送的数据一定到达了接收方或者到达接收方的数据顺序和发送方的一致性。

使用 UDP 协议传输数据的应用程序,必须自己构建发送数据的顺序机制和发送接收的确认机制,以此来保证发送数据的正确到达,保证接收数据的顺序与发送数据的一致性.也就是说,应用程序必须根据 UDP 的缺点提供解决方案

UDP 协议相比较 TCP 协议执行时的速度要比 TCP 快得多,因为 UDP 协议简单得多,对系统造成的负载低。在高负载的系统(例如服务器)或者系统资源受限的系统(例如嵌入式系统)上应用比较多,在不需要可靠传输的应用程序上有比较广泛的应用,例如流媒体的传输域名服务器嵌入式机顶盒系统等。

1. UDP 的数据格式
UDP 传输数据时的字段格式如下图所示:

图片

  • 源端口号和目的端口号分别是一个 16 位的字段,用来表示发送方和接收方的 UDP 端口
  • UDP 数据长度表示 UDP 头部和 UDP 数据段的长度,单位位字节。由于 UDP 的头部为 8 个字节,因此发送 UDP 的长度字段至少为 8 字节。UDP 的长度等于 IP 的长度减去 IP 头部的长度
  • UDP 校验和表示整个 UDP 字段的 CRC16 校验和,它的计算方式与 IP 字段是一致的。UDP 的校验和字段是可选的,即可以不进行 CRC 校验,此时校验和部分为 0 。UDP 校验和允许发送的数据为奇数长度,因此要加一个空字节,即全 0 的字节进行填充,这个字节仅仅是为了方便计算校验和,不发送到目的地址

2. UDP 数据的传输过程
下图所示为使用 UDP 协议的应用程序的数据传输过程,用户数据由主机 A 发送给主机 B ,数据封装在 UDP 的数据部分。

图片

**发送的过程是一个封包的过程。**主机 A 上,在传输层,用户发送的数据增加 UDP 头部,用户数据封装在 UDP 的数据部分。在 IP 层,增加 IP 层的头部, UDP 的数据和头部都封装在 IP 层的数据部分。IP 层将数据传输给网络设备的驱动程序,以太网增加头部和尾部后,发送到以太网上。

**接收数据的过程是一个解封包的过程。**主机 B 上,驱动程序从以太网上接收到数据,然后将数据去除头部和尾部并进行 CRC 校验后,将正确的数据传递给 IP 层。IP 层 IP 头,进行校验,将数据发送给其上层 UDP 层。UDP 将 UDP 的包头剥去,根据应用程序的标识符判断是否将此数据发送给应用程序。在主机 B 上的应用程序会得到干净的有效数据,然后进行处理。

7. 地址解析协议(ARP)

在以太网为基础的局域网中,每个网络接口都有一个硬件地址,这是一个 48 位的值,标识不同的以太网设备,在局域网中必须知道网络设备的硬件地址才能向目的主机发送数据。而在网际网中数据传输的目的地址是 IP 地址,数据要能够正确地传输,必须建立 IP 地址和硬件地址地对应关系,ARP 协议就是其这种作用。

点击下方图片关注我,或微信搜索**“编程笔记本”**,获取更多信息。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值