TCP/IP 协议详解

news/2025/2/9 8:46:12/

文章目录

  • 简介
  • 应用层
  • 传输层
  • 网络层
  • 网络接口层
  • 数据包发送过程
  • TCP 三次握手四次挥手
    • 三次握手
    • 为什么是三次握手
    • 四次挥手
    • 为什么是四次挥手


简介

TCP/IP传输协议,即传输控制/网络协议,也叫作网络通讯协议。它是在网络的使用中的最基本的通信协议。

TCP/IP传输协议对互联网中各部分进行通信的标准和方法进行了规定。并且,TCP/IP传输协议是保证网络数据信息及时、完整传输的两个重要的协议。

TCP/IP传输协议是严格来说是一个四层的体系结构,应用层、传输层、网络层和网络接口层都包含其中。

tcp.jpg

应用层

  1. 为操作系统或网络应用程序提供访问网络服务的接口;

  2. 主要协议:FTP(文件传送协议)、Telnet(远程登录协议)、DNS(域名解析协议)、SMTP(邮件传送协议),POP3协议(邮局协议),HTTP协议(Hyper Text Transfer Protocol)。

  3. 数据传输基本单位为报文。

传输层

  • 传输层最主要的功能就是让应用层的应用程序之间完成通信和数据交换。

  • 在计算机内部运行着很多应用程序,每个应用程序都对应一个端口号,我们一般使用端口号来区分这些应用程序。

  • 传输层的协议主要分为面向有连接的协议 TCP 和面向无连接的协议 UDP

TCP

  • TCP 是一种可靠的协议,它能够保证数据包的可靠性交付;

  • TCP 能够正确处理传输过程中的丢包、传输顺序错乱等异常情况;

  • TCP 还提供拥塞控制用于缓解网络拥堵。

UDP

  • UDP 是一种不可靠的协议,它无法保证数据的可靠交付,相比 TCP ,UDP 不会检查数据包是否到达、网络是否阻塞等情况,但是 UDP 的效率比较高;

  • UDP 常用于分组数据较少或者广播、多播等视频通信和多媒体领域。

网络层

网络层的目的是实现两个端系统之间的数据透明传送,具体功能包括寻址和路由选择、连接的建立、保持和终止等。它提供的服务使传输层不需要了解网络中的数据传输和交换技术。

包含的主要协议:

  • IP协议(Internet Protocol,因特网互联协议)
  • ICMP协议(Internet Control Message Protocol,因特网控制报文协议)

网络接口层

通信链路层也可以分为 物理层数据链路层

  • 物理层:是 TCP/IP 的最底层是负责传输的硬件,这种硬件就相当于是以太网或电话线路等物理层的设备。

  • 数据链路层:位于物理层和网络层中间,数据链路层定义了在单个链路上如何传输数据。

数据链路层主要协议有ARPRARP,主要功能是提供链路管理错误检测、对不同通信媒介有关信息细节问题进行有效处理等。

数据包发送过程

来说一下网络数据包发送的过程:就以我们QQ聊天为例

img

假设QQ1 和QQ2 进行通信,QQ1 想要向QQ2 发送一个数据包,都会经历哪些奇特的操作?

1、应用层处理

QQ1 也就是用户打开了一个聊天窗口输入了你好,然后点击了发送,那么这个你好就作为一个数据包遨游在了网络中,等下还没完呢,应用层还需要对这个数据包进行处理,包括字符编码、格式化等等,这一层其实是 OSI 中表现层做的工作,只不过在 TCP/IP 协议中都归为了应用层。

数据包在发送的那一刻建立 TCP 连接,这个连接相当于通道,在这之后其他数据包也会使用通道传输数据。

2、传输层处理

TCP 会根据应用的指示,负责建立连接、发送数据和断开连接。

TCP 会在应用数据层的前端附加一个 TCP 首部字段,TCP 首部包含了源端口号目的端口号,这两个端口号用于表明数据包是从哪里发出的,需要发送到哪个应用程序上;TCP 首部还包含序号,用以表示该包中数据是发送端整个数据中第几个字节的序列号;TCP 首部还包含 校验和,用于判断数据是否损坏,随后将 TCP 头部附加在数据包的首部发送给 IP。

3、网络层的处理

网络层主要负责处理数据包的是 IP 协议,IP 协议将 TCP 传过来的 TCP 首部和数据结合当作自己的数据,并在 TCP 首部的前端加上自己的 IP 首部。因此,IP 数据包后面会紧跟着 TCP 数据包,后面才是数据本身。IP 首部包含目的和源地址,紧随在 IP 首部的还有用来判断后面是 TCP 还是 UDP 的信息。

IP 包生成后,会由路由控制表判断应该发送至哪个主机,IP 修饰后的数据包继续向下发送给路由器或者网络接口的驱动程序,从而实现真正的数据传输。

4、链路层的处理

经由 IP 传过来的数据包,以太网会给数据附上以太网首部并进行发送处理。以太网首部包含接收端的 MAC 地址、发送端的 MAC 地址以及标志以太网类型的以太网数据协议等。

5、链路层解析

QQ2收到数据包后,首先会从以太网的首部找到 MAC 地址判断是否是发给自己的数据包,如果不是发给自己的数据包则会丢弃该数据包。

如果收到的数据包是发送给自己的,就会查找以太网类型判断是哪种协议,如果是 IP 协议就会扔给 IP 协议进行处理,如果是 ARP 协议就会扔给 ARP 协议进行处理。如果协议类型是一种无法识别的协议,就会将该数据包直接丢弃。

6、网络层解析

经过以太网处理后的数据包扔给网络层进行处理,我们假设协议类型是 IP 协议,那么,在 IP 收到数据包后就会解析 IP 首部,判断 IP 首部中的 IP 地址是否和自己的 IP 地址匹配,如果匹配则接收数据并判断上一层协议是 TCP 还是 UDP;如果不匹配则直接丢弃。

注意:在路由转发的过程中,有的时候 IP 地址并不是自己的,这个时候需要借助路由表协助处理。

7、传输层解析

在传输层中,我们默认使用 TCP 协议,在 TCP 处理过程中,首先会计算一下 校验和,判断数据是否被损坏。然后检查是否按照序号接收数据,最后检查端口号,确定具体是哪个应用程序。

数据被完整的识别后,会传递给由端口号识别的应用程序进行处理。

8、应用层解析

接收端指定的应用程序会处理发送方传递过来的数据,通过解码等操作识别出数据的内容,然后把对应的数据存储在磁盘上,返回一个保存成功的消息给发送方,如果保存失败,则返回错误消息。


TCP 三次握手四次挥手

三次握手

img

  1. 刚开始客户端和服务端都是处于关闭的状态,而且服务器 B 端一直处于监听的状态,时刻监听是否有建立连接的请求;
  2. 当有客户端需要建立连接的时候就会发送一个确定连接的报文,此报文是同步报文SYN = 1,并且会生成一个随机的序号 seq = x,这是第一次握手;
  3. 当服务端接收到请求连接报文的时候,会发送一个同步报文确认报文,此报文 SYN = 1,并且 ACK = 1,同时服务端也会随机生成一个 seq = y,并将 ack 设置成 x + 1,回传给客户端,这是第二次握手;
  4. 当客户端接收到服务端的 ACK 报文后,会回复一个 ACK 确认报文,用于确认确认报文已经收到,此报文 ACK = 1,seq = x + 1, ack = y + 1,这是第三次握手;

说明一下:大写的 ACK 表示报文的类型是确认报文,小写的 ack 是报文里面的确认号,这个确认号是上一次握手对方的 seq 值加 1 得到。

为什么是三次握手

上面是整个三次握手的过程,现在我们分析一下为什么三次握手可以可靠的确定客户端和服务端都能支持的发送和接收数据。

  • 第一次握手:第一次握手是客户端发送同步报文到服务端,这个时候客户端是知道自己具备发送数据的能力的,但是不知道服务端是否有接收和发送数据的能力;

  • 第二次握手:当服务端接收到同步报文后,回复确认同步报文,此时服务端是知道客户端具有发送报文的能力,并且知道自己具有接收和发送数据的能力,但是并不知道客户端是否有接收数据的能力;

  • 第三次握手:当客户端收到服务端的确认报文后,知道服务端具备接收和发送数据的能力,但是此时服务端并不知道自己具有接收的能力,所以还需要发送一个确认报文,告知服务端自己是具有接收能力的。

当整个三次握手结束过后,客户端和服务端都知道自己和对方具备发送和接收数据的能力,随后整个连接建立就完成了,可以进行后续数据的传输了。

四次挥手

三次握手是为了建立可靠的数据传输通道,四次挥手则是为了保证等数据完成的被接收完再关闭连接。既然提到需要保证数据完整的传输完,那就需要保证双方都达到关闭连接的条件才能断开。

img

从上图中我们可以看到:

  1. 客户端发起 FIN 断开连接的报文,携带随机生成的 seq 值 u,发送给服务端,并且自己处于 FIN-WSIT 状态,这是第一次挥手;
  2. 服务端接收到 FIN 报文后,回复一个确认报文,其中 ACK = 1,随机生成一个 seq,以及 ack = u + 1,这是第二次挥手;
  3. 当服务端数据发送完了过后,再发送一个 FIN 报文给客户端,通知客户端,服务端准备关闭连接了,此报文 FIN = 1,ACK = 1,ack = u + 1,seq = w,这是第三次挥手;
  4. 当客户端收到 FIN 确认报文时再发送一个FIN 的确认报文,其中 ACK = 1,seq = u + 1,ack = w + 1,并进入 TIME-WAIT 状态,当等待 2MSL 后关闭连接,这是第四次挥手。注意:这个时候 TCP 连接还没有释放。必须经过时间等待的设置,也就是 2MSL 后,客户端才会进入 CLOSED 状态,时间 MSL 叫做最长报文段寿命(Maximum Segment Lifetime)

为什么是四次挥手

  • 第一次挥手:客户端发起关闭连接的请求给服务端;

  • 第二次挥手:服务端收到关闭请求的时候可能这个时候数据还没发送完,所以服务端会先回复一个确认报文,表示自己知道客户端想要关闭连接了,但是因为数据还没传输完,所以还需要等待;

  • 第三次挥手:当数据传输完了,服务端会主动发送一个 FIN 报文,告诉客户端,表示数据已经发送完了,服务端这边准备关闭连接了。

  • 第四次挥手:当客户端收到服务端的 FIN 报文过后,会回复一个 ACK 报文,告诉服务端自己知道了,再等待一会就关闭连接。

为什么客户端在第四次挥手后还会等待 2MSL?

等待 2MSL 是因为保证服务端接收到了 ACK 报文,因为网络是复杂了,很有可能 ACK 报文丢失了,如果服务端没接收到 ACK 报文的话,会重新发送 FIN 报文,只有当客户端等待了 2MSL 都没有收到重发的 FIN 报文时就表示服务端是正常收到了 ACK 报文,那么这个时候客户端就可以关闭了。


http://www.ppmy.cn/news/584462.html

相关文章

MySQL 异常:max key length is 767 bytes

文章目录 前言1. 767 bytes 解读2. 异常原因3. 5.7 和 8.0 版本的区别 前言 最近迁移几张表,又遇到 767 异常,迁移前只检查了 sql_mode 忽略对比了这个参数,导致几张表创建失败,其实解决方法也很简单,开启 innodb_lar…

IP路由选择过程

1.1路由选择基础 路由选择是指将分组从一个设备通过互联网络发往位于不同网络上的另一个设备的操作。路由器不关注网络中的主机,而只关注互联起来的网络以及通往各个网络的最佳路径。 目标主机的逻辑网络地址用来获取通过可路由网络传送到指定网络中的分组&#xf…

爬虫框架和库有多重要?

爬虫框架和库在网络数据提取和分析中非常重它们为开发人员提供了工具和功能,使他们能够更轻松地从互联网上抓取数据。爬虫框架和库通常提供了高效的网络请求、数据解析和存储机制,简化了爬取过程。 使用爬虫框架库有以下几个重要优势: 快速开…

0基础学习VR全景平台篇第49篇:高级功能-自定义LOGO

功能位置示意 一、本功能将用在哪里? 自定义logo功能,可以在全景作品中自定义植入商企logo,让全景自带推广属性,使宣传效果事半功倍。 备注:不同皮肤自定义logo显示位置不同。 点击这里 查看案例 二、如何使用本功能…

镇魂街武神躯怎么修改服务器,镇魂街武神躯怎么重置守护灵_守护灵重置方法_3DM手游...

镇魂街武神躯怎么重置守护灵?很多小伙伴对于重置守护灵的方法不太清楚,那么小编就给大家介绍一下,下面小编给大家带来《镇魂街武神躯》守护灵重置方法,还不清楚的小伙伴赶紧来看看吧。 《镇魂街武神躯》守护灵重置方法 在《镇魂街》中&#…

镇魂街武神躯怎么修改服务器,镇魂街武神躯怎么重置守护灵 重置方法攻略

守护灵作为游戏中的重要角色,不少玩家前期没有选择好好培养守护灵,很多小伙伴对于重置守护灵的方法不太清楚,下面小编就为大家带来镇魂街武神躯怎么重置守护灵介绍,感兴趣的小伙伴快来了解一下吧! 重置守护灵攻略 在《…

镇魂街武神躯怎么修改服务器,镇魂街武神躯怎么重置守护灵

镇魂街武神躯守护灵和寄灵人是密不可分的,因此很多玩家想知道镇魂街武神躯怎么重置守护灵?游戏宝小编为您带来镇魂街武神躯守护灵重置方法。 镇魂街武神躯怎么重置守护灵? 在《镇魂街》中,曹焱兵、刘羽禅、孙斩天三人都是武神躯&a…

Python数据可视化 Pyecharts 制作 Graph 关系图

大家好,我是Mr数据杨。今天我们要聊聊的是Python中的关系图模块,就像三国演义中的繁复人物关系网一样。 来看看这个"基本设置"部分。比如要描述刘备与关羽、张飞的结义兄弟之情,那么刘备、关羽、张飞就是"节点",他们的结义关系就是"边",类…