互联网基石:TCP/IP 四层模型,由浅入深直击原理!

article/2025/9/19 11:56:10

前言

TCP/IP 是迄今为止最常用的网络互联协议套件,在全球互联网运营方面发挥了巨大作用,可以这样说 TCP/IP 在互联网世界无处不在!

TCP/IP 最初由 DARPA(美国国防高级研究计划局)的两位科学家于 1970 年代开发,这两位科学家分为是 Vint Cerf 和 Bob Kahn,被称为 Internet 之父

当时 NCP 是 ARPAnet 使用的主要传输协议,也就是当今 Internet 的前身,Vint 和 Bob 根据 NCP 的缺点吸取了很多经验教训,TCP/IP 带来的改进非常显着,在 1983 年 TCP/IP 取代了 NCP,成为 ARPAnet 的标准协议。

TCP/IP 在 ARPAnet 成立后,当时加州大学伯克利分校正在开发一个项目,一群科学家正在研究新版本的 Unix 操作系统,即也就是后来的 BSD。1989 年,BSD 开发人员选择 TCP/IP 作为协议栈与其他系统进行通信。

后来他们开发的操作系统在其他大学和机构中非常流行,TCP/IP 也渐渐变得流行起来,此后不久,美国联邦政府也开始测试 TCP/IP 的可用性,这进一步巩固了它在互联网世界中的地位。

什么是 TCP/IP?

TCP/IP 看包含两个部分:

  • TCP

  • IP

TCP/IP 实际包括几十个 Internet 协议,但只有少数是核心协议,其中有两个通常被认为是最重要的,就是我们上面提到的 TCP 和 IP。

IP 属于 OSI 网络层(第三层),在互联网网络中提供寻址、数据报路由等功能;TCP 属于 OSI 传输层(第四层),负责设备上软件进程之间的连接建立和管理以及可靠的数据传输。

由于这两个协议非常重要,所以将这些协议集统称为“TCP/IP”,TCP/IP 的许多最关键的功能都是在第三层和第四层实现的,但是 TCP/IP 不仅仅是 TCP 和 IP,TCP/IP 是一个整体,需要许多不同协议和技术的协同工作,才能构成一个功能性网络,进而正确地为用户提供他们需要的应用程序。

TCP/IP 四层模型?

TCP/IP 包含四层模型,分别是:

下面我们来分别介绍一下每一层。

1、网络接口层

网络接口层是 TCP/IP 四层模型中的第一层,是 OSI 参考模型中定义的物理层数据链路层的组合,这一层主要涉及计算机连接互联网的基础设施,比如以太网电缆、无线网络、网络接口卡、计算机中的设备驱动程序等等。

网络接口层还负责同一网络上两个设备之间的数据传输,例如将数字数据转换为可传输信号。

网络接口层还有一个就是将 IP 数据报封装成网络传输的帧,并将 IP 地址映射到物理地址。

网络接口层涉及协议

网络接口层主要涉及以下协议:

  • 802.3(以太网)

  • 802.11(Wi-Fi)

  • PPP:点对点协议,提供成帧以及许多提高安全性和性能的附加功能。

  • 令牌环

  • FDDI

  • X.25

  • 帧中继

  • SLIP:串行链路 Internet 协议,提供基本的 IP 帧。

网络接口层工作流程

网络接口层其实可以细分为三层:

  • 逻辑链路控制,英文缩写 LLC,负责处理网络层使用的协议的信息,LLC 在接收端帮助决定将数据包传递到目标网络层的相应协议。

  • MAC 层将源 MAC 地址和目标 MAC 地址添加到数据帧中。

  • 物理层将数据帧转换为可以通过网络传输的格式。

比如在有线环境下,物理层会将数据帧转换为电信号,在通信的另一方,将电信号转换回数据帧,从数据包中删除标头,然后将数据包重新组合成完整的数据。

2、网络层

网络接口层是 TCP/IP 四层模型的第二层,又称为互联网层,该层控制流量的流动和路由、寻址,确保数据快速准确地发送,还负责在其目的地重新组装数据包。

  • 寻址:为了与其他主机通信,网络上的每个主机都有一个唯一的标识符,使用这个标识符将数据发送到网络上的特定计算机。唯一标识符有两种类型:逻辑地址物理地址。网路层提供的是一个逻辑地址,即 IP 地址

  • 路由:将数据包从源移动到目的地的方法,一般运行在路由器上或者支持路由的交换机上,网络设备上运行的算法可以为数据包的传递找到最佳最短的路径。

网络层涉及协议

网络层涉及的协议主要有:

  • IP

  • ARP

  • ICMP

其中最核心的是 IP 协议,我们放到本节最后讲,先来看下 ARP:

ARP

我们常说的 ARP 解析就是这个 ARP,ARP 的英文全称是Address Resolution Protocol,中文意思就是地址解析协议,用于识别 MAC 地址,如果设备知道目标设备的 IP 地址,则 ARP 向局域网中的所有设备发送请求,来搜索具有给定 IP 的设备的 MAC 地址,然后具有该 IP 的设备会发送一个带有其 MAC 地址的 ARP 响应。

在 Windows 或 macOS 中,可以在终端中输入命令arp -a查询 ARP 表:

ICMP

ICMP 英文全称Internet Control Message Protocol,中文意思就是互联网控制消息协议,用于报告主机之间通信错误,比如用的最多的就是 ping,ping 可以检查主机之间是否存在连接,检查丢失的数据包数量和传输延迟。

比如我们现在想测试一下我的电脑是否能连接到www.wljslmz.cn,可以使用命令:

ping www.wljslmz.cn

复制代码

从截图中我们清晰的看到我向www.wljslmz.cn发送了四个包,接收到四个包,没有丢失任何包,且还能看到每个包的时间,还帮忙统计出最短耗时、最长耗时、平均耗时。

IP

IP 是非常重要的协议,英文全称Internet protocol,中文意思就是互联网协议

IP 协议有两个版本:

  • IPv4

  • IPv6

IPv4 使用更广泛,但只有 32 位用于寻址,大约有 43 亿(约 4.3×10 9)个可用地址,但不幸的是,在 2019 年 11 月 25 日这一天,根据欧洲区域互联网注册机构 RIPE 说法,IPv4 地址已经全部分配完。

40 多亿个 IP 地址中,有 15 多亿个是分配给美国,是所有国家中数量最多的,每 1000 人大约有 4911 个 IP 地址,这些约占 IP 地址总数的 35.9%。

中国的 IP 地址数量位居第二,为 3 亿多个,约占 IP 地址总数的 7.7%,中国人口比美国多得多了,人均 IP 地址数非常少。

后面第三名、第四名、第五名分别是:

  • 日本,拥有 2 亿多个

  • 英国,拥有 1 亿 2 千多万个

  • 德国,拥有 1 亿 1 千多万个

IPv6 目前渐渐流行起来,1995 年 12 月,IETF 发布了 RFC 1883,即 IPv6 规范,它一共有 128 位地址,这个数目简直就是太庞大了,2^128 个,IPv4 是 2^32 个,这个已经是 43 亿了,2^128 个什么概念,不是有句笑话形容 IPv6 的地址数目的嘛,说给地球上每一粒沙子都分配一个 IPv6 的地址都分配不完,可想而知 IPv6 提供的地址数有多大。

有人问了,那 IPv6 实际上总地址数有多大呢,我通过程序去计算的,因为计算器没办法算,准确的数字是340,282,366,920,938,463,463,374,607,431,768,211,456,人类已经无法去描述这个庞大的数字了。

根据谷歌统计网站统计,截止 2022 年 7 月 25 日,IPv6 的使用率已经达到了 37.78%,这个数字虽然比 2022 年 6 月份 40%几略微有点下降,不过统计图的总体趋势是上升的。

3、传输层

传输层是 TCP/IP 四层模型的第三层,又称为运输层,与 OSI 模型中传输层具有相似的功能和特性,主要负责数据在网络中传输时的可靠性、流量控制和校正。就跟发送一个有保险的包裹一样:传输层将数据分成数据包,确认它从发送者收到的数据包,并确保接收者确认它收到的数据包。

传输层涉及协议

传输层主要就涉及两种协议,可谓是家喻户晓:

  • TCP

  • UDP

TCP

TCP 英文全称:Transmission Control Protocol,中文意思:传输控制协议,用于在 IP 之上确保数据包的可靠传输,是一种面向连接的协议。

在发送端,TCP 将整个消息分成更小的单元,称为,每个段包含一个序列号,该序列号是重新排序帧以形成原始消息所需的。

在接收端,TCP 收集所有段并根据序列号对它们重新排序。

TCP 连接就是用传输中的三次握手进行连接的,三次握手之前瑞哥也有详细讲过,感兴趣的朋友可以去历史文章中翻一翻。

TCP 三次握手简单来说就三步:

  • 第一步:客户端向服务端发送 TCP SYN 序列号启动连接

  • 第二步:服务端向客户端发送 TCP ACK 确认号(客户端的 SYN 值加 1)和自己的序列号 SYN 回应

  • 第三步:客户端向服务端发送 ACK 确认号(服务端的 SYN 值加 1)回应。

至此 TCP 就建立好了连接。

UDP

UDP 英文全称:User Datagram Protocol,中文意思:用户数据报协议,是一种面向无连接的、不可靠的协议。

UDP 没有握手过程,源 UDP 只是将每个数据报交给网络层的 IP,然后继续创建下一个数据报,目的 UDP 端口监听传入的数据报并将数据传递给应用层,UDP 无法恢复丢失的数据报。

TCP 和 UDP 区别

  1. TCP 面向连接,UDP 面向无连接

  2. UDP 比 TCP ,因为 UDP 不对数据包进行排序或错误检查。

  3. TCP 比 UDP 更可靠,TCP 提供错误检查并确保数据包以正确的顺序传送到通信应用程序。

  4. TCP 比 UDP 稍微安全一些,因为 TCP 会跟踪所有数据包,因此更难插入恶意数据。

4、应用层

应用层是 TCP/IP 四层模型的第四层,TCP/IP 中的应用层对应 OSI 模型中的会话层、表示层、应用层,即应用层 = 会话层 + 表示层 + 应用层

应用层主要提供用户和应用程序之间的接口。

应用层涉及协议

应用层涉及的协议很多,常见的比如:

  • HTTP/HTTPS:超文本传输协议

  • FTP:文件传输协议

  • SMTP:简单邮件传输协议

  • WS/WSS:Websocket

  • SSH:安全外壳

  • SNMP:简单网络管理协议

  • DNS:域名系统

  • DHCP:动态主机配置协议

很多很多,这里列举的只是我们经常遇到的。

下面我们稍微介绍一下这几个应用层的协议,这里我不做细节上的梳理,毕竟本文的重点事介绍 TCP/IP 模型,Websocket、DNS、DHCP之前瑞哥也有专门的文章介绍,感兴趣的朋友也可以去历史文章中翻一翻。

HTTP/HTTPS

  • HTTP 英文全称:Hypertext Transfer Protocol,中文名称:超文本传输协议

  • HTTPS 英文全称:Hyper Text Transfer Protocol Secure,中文名称:安全超文本传输协议

HTTP 提供了 Web 服务器和客户端(浏览器)之间的标准通信规则,使用的默认端口号为 80

HTTPS 是 HTTP 的安全版,使用 SSL 加密整个通信信息,使用的默认端口号为 443

FTP

FTP 英文全称:File Transfer Protocol,中文意思:文件传输协议,用于计算机之间传输文件,FTP 是客户端-服务器协议,客户端会请求文件,本服务器会响应文件。

  • 控制连接使用端口 21

  • 传输数据使用端口 20

SMTP

SMTP 英文全称:Simple Mail Transfer Protocol,中文意思:简单邮件传输协议,主要用于将电子邮件从电子邮件客户端发送到电子邮件服务器,以及将邮件消息从一个邮件服务器转发到另一个邮件服务器。

WS/WSS

  • WS 英文全称:WebSocket

  • WSS 英文全称:WebSocket Security

WS/WSS 和 HTTP/HTTPS 很类似,一个是不安全的,一个是安全的,但是 WS 和 HTTP 本身是两个不同协议。

WebSocket 用于 Web 浏览器和服务器之间建立持久、双向、全双工 TCP 连接。

与 TCP 不同的是 WebSocket 握手后,通信通道将一直保持打开状态,可以进行连续的通信,服务器可以独立地向客户端发送数据,而无需客户端请求,如果服务器有新信息,也可以主动发送给客户端,而不需要客户端的任何特定请求,这就是 WebSocket 的强大之处。

WSS 和 HTTPS 类似,是一种安全的 WebSocket 技术,信息都是经过加密的。

SSH

SSH 英文全称:Secure Shell Protocol,中文意思:安全外壳协议,是一种远程管理协议,允许用户通过 Internet 访问、控制和修改远程服务器。

SSH 服务是作为未加密 Telnet 的安全替代品而创建的,它使用加密技术来确保进出远程服务器的所有通信都以加密方式进行。

SNMP

SNMP 英文全称:Simple Network Monitoring Protocol,中文名称:简单网络管理协议,是一组用于网络管理和监控的协议。

SNMP 一共三个版本:

  • SNMPv1

  • SNMPv2

  • SNMPv3

DNS

DNS 英文全称:Domain Name System,中文名称:域名系统

计算机通过使用 IP 地址相互通信,IP 地址是一串数字,不太好记忆,DNS 的作用就是将这些 IP 地址转换为容易记忆的域名。

DHCP

DHCP 英文全称:Dynamic Host Control Protocol,中文名称:动态主机控制协议,是一种为网络设备自动提供 IP 地址的服务。

没有 DHCP 前,IP 地址都是静态配置的,但是静态配置的方式不适用大型网络,假如有 1 万台、10 万台设备,还是一台一台设备配置的话非常低效且容易发生错误,那么 DHCP 就是解决了这个痛点。

如图,DHCP 过程一般分为四个过程:

  • Discover:客户端使用 UDP 端口 67 发送一个 Discover 广播消息,尝试联系网络上可用的任何 DHCP 服务器。

  • Offer:服务器使用 UDP 端口 68 响应 Offer 广播消息。

  • Request:当客户端选择了某个 IP 配置时,它会向 DHCP 服务器发送一个 Request 消息,通知指定的 IP 地址已经被选择。

  • Acknowledgment:服务器最后响应一个 Acknowledgment 消息,并将网络参数发送给客户端。

以上就是 TCP/IP 四层模型每一层的详细介绍,瑞哥这里用这一张图来概括一下:

这张图大家可以收藏一下,非常形象,从下往上分别是:

  1. 网络接口层

  2. 网络层

  3. 传输层

  4. 应用层

TCP/IP 模型和 OSI 模型对比

在上一小节,我们也多少提到 TCP/IP 模型中网络接口层相当于是 OSI 的物理层、数据链路层的集合,应用层相当于 OSI 的应用层、表示层、会话层的集合,我们同样用一张图形象的表示一下:

总结

正如文章开头所说的那样,TCP/IP 是互联网的基石,没有 TCP/IP 就没有我们现在庞大的互联网,在没有阅读本文之前,您可能觉得 TCP/IP 这么熟悉、这么简单的概念用得着花一篇长文来讲吗,看了本文我觉得,一篇文章都不够,一本书都能去讲,因为 TCP/IP 四层模型每一层涉及到的协议就非常多,我们还只是介绍了 10 几个比较常见的协议,真正意义上,TCP/IP 模型就包含几十个协议。

本文花了 5000 来字从 TCP/IP 诞生的背景、原理、模型、每一层的含义、涉及的协议、以及和 OSI 七层模型的对比进行详细的介绍,相信看完本文,一定会有所收获。


小伙伴们有兴趣想了解内容和更多相关学习资料的请点赞收藏+评论转发+关注我,后面会有很多干货。
我有一些面试题、架构、设计类资料可以说是程序员面试必备!所有资料都整理到网盘了,需要的话欢迎下载!私信我回复【07】即可免费获取

 

\\

原文出处:xie.infoq.cn/article/3a4caa0fced9ee9d78b9b9404


http://chatgpt.dhexx.cn/article/xK3tJ6RK.shtml

相关文章

「网络基础」TCP/IP协议4层模型,一分钟了解下

一、TCP/IP四层模型 1、网络接口层 2、互联网层 3、传输层 4、应用层 TCP/IP和OSI七层对应关系: OSI&TCP IP 应用层协议对应关系: 【了解】Dynamic Host Configuration Protocol (DHCP)/BootP(Bootstrap Protocol)动态主机配置协议(DHCP)服务器…

maven快速打包

maven快速打包 你是否打个包需要很长时间。如:15-20分钟。那可能是你的操作方式有问题。 慢速的打包方式: 每次都clean一下后,再重新打包。 我之前也是这样做的,每次打包都需要10分钟。 正确的快速打包方式: 不clea…

maven打包指定jdk的版本

文章目录 问题 问题 今天遇到个问题,项目中新写了一个接口,其中用到了lambda表达式,本地跑是没问题的,但提交到gitLab上,自动打包部署时却报错了(这是其他同事配置的),报错信息如下: 可以看出…

IDEA使用maven进行打包详细记录

前言 IDEA打包有两种方式&#xff1a; 1.build打包 2.maven打包 一开始用第一种方式build打包后运行报错&#xff0c;然后用第二种打包后运行成功。 特此记录一下&#xff0c;用maven进行打包&#xff01; 一、配置pom.xml文件 <build><plugins><plugin>…

MAVEN工具篇——maven打包跳过测试

使用Maven打包的时候&#xff0c;可能会因为单元测试打包失败&#xff0c;这时候就需要跳过单元测试。 Maven跳过单元测试主要可以分为三种方法。 一、命令行方式跳过测试 我们可以用两种命令来跳过测试 mvn clean install -DskipTestsmvn clean install -Dmaven.test.skiptr…

idea中Maven打包

1.环境依赖 jdk maven maven打包插件引入 1.1 maven打包&#xff0c;首先在pom文件中加上build属性&#xff0c;和dependencies是同级的&#xff1a; <build> <!--打包出来的文件名,可以不填写&#xff0c;有默认值--> <finalName>Test</fin…

maven打包时, 资源文件没有被打包进来的问题

问题起因 我们系统使用Mybatis作为持久层框架&#xff0c;这里不详细描述Mybatis框架的使用方法&#xff0c;我们讲述三种加载mapper的方式总结&#xff1a; <mapper resource"" />加载普通的xml文件&#xff0c;传入xml的相对路径(相对于类路径)<mapper c…

【Maven】通过maven对项目打包

文章目录 1.Maven项目打包操作1.1 独立模块1.2 子项目依赖公共模块 2. 知识拓展 1.Maven项目打包操作 首先&#xff0c;在使用maven插件对项目进行打包 首先需要导入一下pom依赖 <build><plugins><plugin><groupId>org.springframework.boot</grou…

MAVEN打包这一篇就够了

Maven打包说明 IDEA目录结构 Java代码从编码到最后运行到两个核心步骤为"编译"和"执行"。"编译"会根据"源代码"产出对应的".class"文件&#xff0c;而"执行"就是让程序运行起来&#xff0c;运行的对象就是这些&qu…

Maven项目的简单打包

最简单的方法 首先是在maven项目的pom.xml中添加打包的插件&#xff0c;这里有很多种方式的。最最简单的就是只使用maven-compiler-plugin、maven-jar-plugin插件&#xff0c;并且指定程序入口。相关代码如下&#xff1a; pom.xml文件&#xff1a; <?xml version"1…

关于maven打包出错解决

今天在使用maven打包时出现错误&#xff0c;因此记录一下。。 出现错误的原因是因为maven中的指定的java版本与项目使用的java版本不一致导致的。。 maven中的java版本为11 而项目使用版本为1.8 因此会出现如下错误 解决版本有两种&#xff0c;一种是修改maven中对应的java版本…

maven打包步骤

1&#xff1a;配置maven环境 2、项目中进行打包配置 3、先进行mvn clean 4、进行打包 5、通过cmd进行项目启动 6、测试项目是否已启动 结束&#xff0c;验证ok

SpringBoot - Maven方式打包

SpringBoot 为当前最流行的JAVA框架 , 内嵌了 Tomcat 服务器 , 我们不用再像以前 Spring 那样打包成 war , 然后将 war 扔到 tomcat 中运行 。 我们现在可以直接将 SpringBoot 项目打包为一个内置 tomcat 的可运行 jar , 通过 java -jar xxx.jar 直接运行 (方便易用) 。 打包 S…

Maven打包操作

对于企业级项目&#xff0c;无论是进行本地测试&#xff0c;还是测试环境测试以及最终的项目上线&#xff0c;都会涉及项目的打包操作。对于每个环境下的项目打包&#xff0c;对应的项目所需要的配置资源都会有所区别&#xff0c;实现打包的方式有很多种&#xff0c;可以通过an…

Maven打包时指定配置文件

springboot项目通常会有部署到测试、演示、生产等多个环境&#xff0c;每次打包时都需要修改配置文件或指定配置文件&#xff0c;既麻烦&#xff0c;也不便于war包部署和版本管理。可以在maven打包时指定配置文件&#xff0c;实现打包配置文件零修改。 1、修改pom文件&#xff…

Maven打包插件介绍

文章目录 1. maven介绍2. 生命周期及插件2.1 总览生命周期2.2 打包插件2.2.1 maven-jar-plugin2.2.2 maven-assembly-plugin2.2.3 maven-shade-plugin2.2.4 maven-war-plugin2.2.4.1 jar和war 2.2.5 maven-source-plugin 3. springboot打包插件4.实际操作4.1 一个可用的打包插件…

maven项目如何打包

说明(java)&#xff1a; &#xff08;1&#xff09;胖包&#xff1a;将maven项目中的依赖包和项目打为一个包 。 &#xff08;2&#xff09;瘦包&#xff1a;直接打包&#xff0c;不打包依赖包&#xff0c;仅打包出项目中的代码到JAR包中。 1.打瘦包 2.只打胖包 2-1.快捷键…

Maven工程打包jar

Maven打包一般可以生成两种包一种是可以直接运行的包&#xff0c;一种是依赖包&#xff08;只是编译包&#xff09;。Maven默认打包时jar&#xff0c;如果需要修改其他类型。可以修改pom.xml <packaging>jar/ear/ejb</packaging> Maven工程默认引入的插件: 1.一般…

Maven打包的三种方式

Maven可以使用mvn package指令对项目进行打包&#xff0c;如果使用Java -jar xxx.jar执行运行jar文件&#xff0c;会出现"no main manifest attribute, in xxx.jar"&#xff08;没有设置Main-Class&#xff09;、ClassNotFoundException&#xff08;找不到依赖包&…

maven命令行打包

maven打包项目 maven项目打包命令行maven打包本地资源文件夹使用命令行打包(maven) maven项目打包 当前的Java项目中我们都习惯使用maven来管理项目中的jar包的依赖关系&#xff0c;同时通过maven我们也可以将项目打包到"本地" 或者 “自己远程的maven仓库中” 命令…