9.TCP/IP协议栈——补充协议栈和协议数据格式

5.1 节对 ISO/OSI 的 7 层结构进行了简单的介绍,由于 ISO 制定的 OSI 参考模型过于

庞大、复杂,在实现时造成了很多困难,从而招致了许多批评。在实际实现中,TCP/IP 协

议栈获得了更为广泛的应用,目前主流的操作系统网络协议栈基本上采用了 TCP/IP 协

议栈

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

经典的 TCP/IP 参考模型从上至下分为 4 个层次:应用层、传输层、网络互联层和主

机到网络层。与 OSI 模型不同的是在 TCP/IP 参考模型中,根据实际情况将 OSI 参考模型

的会话层和表示层合并到应用层中;同时,将 OSI 参考模型中的数据链路层和物理层合并

为主机到网络层。TCP/IP 参考模型与 OSI 参考模型的对照参见图 5.3。

实际应用中 TCP/IP 的层次结构如图 5.4 所示,其各层的主要功能如下所述。

  • 主机到网络层:包括设备和数据链路层的主机到网络层,在 TCP/IP 参考模型中并

没有描述这一层的具体实现,只是规定能给其上一层的网络互联层提供访问接口,

可以传输 IP 数据包,这一层的具体实现随着网络类型的不同而不同。

  • 网络互联层:网络互联层是整个 TCP/IP 协议栈的核心。它将数据包进行分组并发

往目的主机或者网络,为了尽快地发送分组,一个数据包的分组可能要经过不同

的路径进行传递。这造成了分组之间到达目的网络或者主机的顺序不是原来发送

分组的顺序,需要在本层对分组进行排序。网络互联层定义了数据包的分组格式

和协议——IP 协议(Internet Protocol),因此网络互联层又经常称为 IP 层。网络

互联层的功能有路由、网际互联和拥塞控制等。

  • 传输层:TCP/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、网络文件共享 NFS 和 SAMBA 等,以及两

种方式均有实现的协议,例如目前应用十分广泛的多种 P2P 协议(BitTorrent、

eMule 等)。

注意:IP 层中包含网际控制报文协议(ICMP)和地址识别协议,实际上它们并不是 IP

层的一部分,但直接同 IP 层一起工作。ICMP 用于报告网络上的某些出错情况,

允许网际路由器传输差错信息或测试报文。ARP 处于 IP 和数据链路层之间,它

是在 32 位 IP 地址和 48 位局域网地址之间执行翻译的协议。

2. 主机到网络层协议

通常情况下,主机到网络层的协议对应于 OSI 的数据链路层,对于硬件及其驱动层

TCP/IP 协议没有进行规范。由 TCP/IP 的 4 层结构可以看出,本层主要为 IP 协议和 ARP

协议提供服务、发送和接收网络数据报。本层中由于要实现跨网和跨设备的互通,有很多

的实现方式,例如串行线路(Serial Line IP,SLIP)、点对点 PPP 等,本书中仅对以太网的

实现方式进行简单地介绍

3. IP 协议

IP 协议是 TCP/IP 协议中最重要的协议,它为 TCP、UDP、ICMP 等协议提供传输的通

路。IP 层的主要目的是提供子网的互联,形成较大的网络,使不同的子网之间能传输数据。

IP 层主要有如下作用。

数据传送:将数据从一个主机传输到另一个主机。

寻址:根据子网划分和 IP 地址,发现正确的目的主机地址。

路由选择:选择数据在互联网上的传送路径。

数据报文的分段:当传送的数据大于 MTU 时,将数据进行分段发送和接收并组装。

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

各部分介绍,如版号详见《linux网络编程》pdfp170

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

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

它是TCP/IP协议族的一个子协议,用于在IP主机路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。 发送的出错报文返回到发送原数据的设备,因为只有发送设备才是出错报文的逻辑接受者。

我们在网络中经常会使用到ICMP协议,比如我们经常使用的用于检查网络通不通的Ping命令(Linux和Windows中均有),这个“Ping”的过程实际上就是ICMP协议工作的过程。还有其他的网络命令跟踪路由的Tracert命令也是基于ICMP协议的。

ICMP 协议的数据位于 IP 字段的数据部分,它是在 IP 报文的内部被传输的,如图 5.7

表示 ICMP 报文在 IP 报文中的位置。

ICMP 报文的数据格式如图 5.8 所示,ICMP 报文的前 4 个字节的格式是相同的,表示

类型、代码和校验和,而后面的字节则互不相同。类型字段为 8 个位,可以表示 15 个不同

类型的 ICMP 报文。代码段用于对类型字段 ICMP 报文的详细规定,最多可以表示 16 种类

型。校验和表示的范围覆盖整个 ICMP 的报文,包括头部和数据部分,校验方法与 IP 一致

(CRC16),ICMP 协议的校验和是强制性的。

2.ICMP 的报文类型

3.目的不可达的报文格式

4.地址掩码的请求应答格式

5.时间戳的请求应答格式

5. 传输控制协议(TCP)

传输控制协议(Transmission Control Protocol),简称 TCP 协议,它在原有 IP 协议的

基础上,增加了确认重发、滑动窗口和复用/解复用等机制,提供一种可靠的、面向连接的

字节流服务。

TCP 的特点

TCP 协议的特点如下所述

    字节流的服务:使用 TCP 协议进行传输的应用程序之间传输的数据可视为无结构

的字节流,基于字节流的服务没有字节序问题的困扰。

面向连接的服务:在数据进行传输之前,TCP 协议需要先建立连接,之后的 TCP

报文在此连接的基础上传输。

    可靠传输服务:基于校验和应答重发机制保证传输的可靠性。接收方对接收到的

报文进行校验和计算,如果有误,不发送确认应答,发送方在超时后会自动重发

此报文。

    缓冲传输:缓冲传输可以延迟传送应用层的数据,允许将应用程序需要传送的数

据积攒到一定的数量才进行集中发送。

    全双工传输:各主机 TCP 协议以全双工的方式进行数据流交换。

流量控制:TCP 协议的滑动窗口机制,支持主机间的端到端的流量控制。

TCP 的数据格式

         TCP 在 IP 协议的基础上进行传输数据,TCP 数据在 IP 报文中的位置

    *建立连接的三次握手

主机 A 和主机 B 要使用 TCP 协议进行通信,需要先建立一条 TCP 连接,如图 5.16 所

示。为了建立一条 TCP 的连接,主机 A 和 B 需要进行三次通信过程(通常称为“三次握

手”,three way handshake)。

过程:首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了。

(1)主机 A 发送一个 SYN ( 是TCP/IP建立连接时使用的握手信号)段到主机 B 告诉 B 想要连接的主机端口,以及初始的序列

号(ISN,这里为 1234567890)。

(2)主机 B 应答,其中 SYN 段为主机 B 的初始序列号(ISN,这里为 987654321),

ack 段为主机 A 发送的 ISN+1,即 1234567891。

(3)主机 A 将主机 B 发送的 SYN 段+1 作为确认号返回给主机 B 作为应答。

上面 3 个步骤完成了 TCP 连接的建立,连接建立之后,主机 A 和主机 B 之间可以进

行 TCP 的数据接收和发送操作了。

     释放连接的四次握手过程

建立一个 TCP 连接需要 3 次握手,而终止一个 TCP 连接则需要 4 次握手。如图 5.17

所示为一个主机 A 主动发起的与主机 B 终止 TCP 连接的过程

https://mp.weixin.qq.com/s/ikVublI1pzJyllENYKZhZA

释放连接的四次握手过程过程:

假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!

   1)主机 A TCP 协议栈发送 FIN 字段,序列号为 1234567891 的释放连接请求。

(2)主机 B 先确认主机 A 的 FIN 请求,确认号为 1234567892,在主机 A 序列号上

加 1。

(3)主机 B 发送 FIN 请求。

(4)主机 A 对主机 B 的 FIN 请求确认。

    TCP 的封装解封过程

为使用 TCP 协议的应用程序的数据传输过程,用户数据由主机 A 发送给

主机 B,数据封装在 TCP 的数据部分。

发送的过程是一个封包的过程。在主机 A 上,在传输层,用户发送的数据增加 TCP

头部,用户数据封装在 TCP 的数据部分。在 IP 层增加 IP 的头部数据,TCP 的数据和头部

都封装在 IP 层的数据部分。IP 层将数据传输给网络设备的驱动程序,以太网增加头部和

尾部后,发送到以太网上。

接收数据的过程是一个解封包的过程。在主机 B 上,驱动程序从以太网上接收到数据,

然后将数据去除头部和尾部并进行 CRC 校验后,将正确的数据传递给 IP 层。IP 层剥去 IP

头,进行校验,将数据发送给其上层 TCP 层。TCP 则将 TCP 的包头剥去,根据应用程序

的标识符判断是否发送给此应用程序。在主机 B 上的应用程序会得到干净的有效数据,然

后进行处理。

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

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

UDP 协议是 TCP/IP 的传输层协议的一部分,与 TCP 的传输不一样,它提供无连接的、

不可靠的传输服务。UDP 协议把应用程序需要传递的数据发送出去,不提供发送数据包的

顺序;接收方不向发送方发送接收的确认信息,如果出现丢包或者重包的现象,也不会向

发送方发送反馈,因此不能保证使用 UDP 协议的程序发送的数据一定到达了接收方或者到

达接收方的数据顺序和发送方的一致性。

使用 UDP 协议传输数据的应用程序,必须自己构建发送数据的顺序机制和发送接收

的确认机制,以此来保证发送数据的正确到达,保证接收数据的顺序与发送数据的一致性,

也就是说,应用程序必须根据 UDP 的缺点提供解决方案。

UDP 协议相比较 TCP 协议执行时的速度要比 TCP 快得多,因为 UDP 协议简单得多,

对系统造成的负载低。在高负载的系统(例如服务器)或者系统资源受限的系统(例如嵌

入式系统)上应用比较多,在不需要可靠传输的应用程序上有比较广泛的应用,例如流媒

体的传输、域名服务器、嵌入式机顶盒系统等。

7. 地址解析协议(ARP)

在以太网为基础的局域网中,每个网络接口都有一个硬件地址,这是一个 48b 的值,

标识不同的以太网设备,在局域网中的必须知道网络设备的硬件地址才能向目的主机发送

数据。而在网际网中数据传输的目的地址是 IP 地址,数据要能够正确地传输,必须建立 IP

地址和硬件地址的对应关系,ARP 协议就是起这种作用的(就是ip转成硬件地址,或者硬件地址转成ip)。

ARP 协议为 IP 地址到硬件地址提供动态的映射关系,如图 5.22 所示为进行 IP 地址和

硬件地址映射的 ARP 映射关系图。ARP 的高速缓存维持这种映射关系,其中存放了最近

IP 地址到硬件地址的映射记录,高速缓存中的每项记录的生存时间为 20 分钟,开始时间

从映射关系建立时算起。

ARP 过程 

如图 5.23 所示为同一局域网中的主机 A 和主机 B,IP 地址分别为 192.168.1.150 和

192.168.1.151。下面是一个 ping 过程的实例,用这个实例来说明 ARP 协议的作用和在实际

过程中的位置。

主机 A 用 ping 命令探测主机 B,命令如下:

$ping B

其过程如图 5.24 所示,会进行如下过程的步骤,步骤的编号已在图 5.24 中标出。

步骤 a:应用程序 ping 会判断发送的是主机名还是 IP 地址,调用函数 gethostbyname()解析主机名 B,将主机名转换成一个 32 位的 IP 地址。这个过程叫做 DNS

域名解析。

步骤 b:ping 程序向目的 IP 地址发送一个 ICMP 的 ECHO 包。

步骤 c:由于主机 A 和主机 B 在同一个局域网内,必须把目标主机的 IP 地址转换

为 48 位的硬件地址,即调用 ARP 协议,在局域网内发送 ARP 请求广播,查找主

机 B 的硬件地址。

步骤 d:主机 B 的 ARP 协议层接收到主机 A 的 ARP 请求后,将本机的硬件地址

填充到合适的位置后,发送 ARP 应答到主机 A。

步骤 e:发送 ICMP 数据包到主机 B。

步骤 f:主机 B 接收到主机 A 的 ICMP 包,发送响应包。

步骤 g:主机 A 接收到主机 B 的 ICMP 响应包。

在 ping 命令之后可以查看 ARP 的高速缓存,用 arp 命令加-v 选项进行检查,-v 选项

是显示详细信息,下面是一个主机的 ARP 高速缓存中的内容:

$arp -v

地址 类型 硬件地址 标志 Mask 接口

localhost ether 00:50:56:f7:88:37 C eth0

localhost ether 00:50:56:e3:84:f0 C eth0

注意:

1. TCP/IP 和UDP最大的区别就是:TCP/IP是面向连接的,UDP是非面向连接的。通俗一点说就是:TCP/IP管发管到,UDP管发不管到。因此,在安全性方面来说,TCP/IP更具有优越性。

2. 什么是 TCP/IP?

TCP/IP 是供已连接因特网的计算机进行通信的通信协议。

3.TCP与IP的区别

TCP:(传输层)又叫传输控制协议(Transmission Control Protocal)是一种面向连接的、端对端的、可靠的、基于IP的传输层协议。主要特点是3次握手建立连接,4次挥手断开连接。

IP:又叫因特网协议(Internet Protocol),IP协议位于网络层,IP协议规定了数据传输时的基本单元(数据包)和格式,IP协议还定义了数据包的递交办法和路由选择。

总结:整个网络中的传输流程是:IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层—TCP层;相反,IP层也把从TCP接收来的数据包传送到更低层。

TCP和IP的关系是:IP提供基本的数据传送,而高层的TCP对这些数据包做进一步加工,如提供端口号等等。

附:要细看ip,tcp,udp,icmp头部的话,看第十三章第5

猜你喜欢

转载自blog.csdn.net/weixin_40535588/article/details/89218249
今日推荐