从今天起,我们正式进入第二部分------网络基础。继续学习网络基础、网络协议等相关内容🌟🌟🌟
目录
[1.1 分层思想](#1.1 分层思想)
[1.2 OSI参考模型](#1.2 OSI参考模型)
[1.3 数据封装与解封装](#1.3 数据封装与解封装)
[1.3.1 数据的封装过程](#1.3.1 数据的封装过程)
[1.3.2 数据的解封装过程](#1.3.2 数据的解封装过程)
[2.1 TCP/IP模型与OSI模型对比](#2.1 TCP/IP模型与OSI模型对比)
[2.2 TCP/IP协议族组成](#2.2 TCP/IP协议族组成)
[3.1 抓包分析TCP/IP协议架构](#3.1 抓包分析TCP/IP协议架构)
[4.1 数据链路层简述](#4.1 数据链路层简述)
[4.1.1 帧结构](#4.1.1 帧结构)
[5.1 TCP/IP协议族](#5.1 TCP/IP协议族)
[5.2 TCP三次握手](#5.2 TCP三次握手)
[5.3 TCP四次挥手](#5.3 TCP四次挥手)
[5.4 TCP(传输控制协议)](#5.4 TCP(传输控制协议))
[5.5 UDP](#5.5 UDP)
[5.6 IP](#5.6 IP)
[5.7 TCP/IP](#5.7 TCP/IP)
首先我们来了解一下网络协议
网络协议是一组规则和标准,用于定义电子设备如何在网络上进行通信。这些协议确保数据在不同设备之间传输时的准确性和一致性。网络协议涉及多个层面,通常按照 OSI(Open Systems Interconnection)模型或 TCP/IP 模型来组织,这两个模型都描述了网络通信的不同层次。
一、OSI模型
OSI(Open Systems Interconnection)模型是一个概念性框架,用于标准化不同计算机系统之间的通信过程,以便不同系统能够通过网络相互通信。这个模型由国际标准化组织(ISO)在1984年提出,它将网络通信划分为七个抽象层次,每一层都有特定的功能和协议。
1.1 分层思想
分层思想(Layered Architecture)是一种常用的软件设计方法,它将应用程序分解为一系列的层次,每个层次都有特定的职责。这种设计方法有助于降低系统的复杂性,提高代码的可维护性和可扩展性。在软件工程中,分层思想广泛应用于多种架构模式,如经典的三层架构、多层架构和n层架构等。
以下是分层思想的一些常见层次:
- 表示层(Presentation Layer): 这一层负责与用户直接交互的界面,处理用户输入和向用户展示信息。在Web应用中,这通常包括HTML页面、CSS样式和JavaScript代码。
- 业务逻辑层(Business Logic Layer): 也称为服务层或应用层,这一层包含了应用程序的核心业务规则和逻辑。它处理数据的业务相关操作,如计算、数据处理和业务规则的实施。
- 数据访问层(Data Access Layer): 这一层负责与数据库或其他持久化存储进行交互,执行数据的增删改查操作。它抽象了数据访问的细节,使得业务逻辑层不需要关心数据是如何存储和检索的。
- 数据层(Data Layer): 这一层通常指的是数据库和数据存储,它们负责存储应用程序的数据。数据层可以是关系型数据库、NoSQL数据库、文件系统或其他任何形式的数据存储。
在实际应用中,分层架构可以进一步细化,例如:
- Web层:处理HTTP请求和响应,通常与表示层合并。
- 控制层(Controller Layer):在MVC(Model-View-Controller)架构中,控制层负责接收用户的输入,调用业务逻辑层,并选择适当的视图进行响应。
- 服务层(Service Layer):在一些架构中,服务层位于表示层和业务逻辑层之间,提供一些跨多个业务逻辑的服务和操作。
- 基础设施层(Infrastructure Layer):提供技术基础服务,如邮件发送、日志记录、配置管理等。
分层思想的好处包括:
- 分离关注点:每个层次只关注其职责范围内的事情,减少了不同部分之间的耦合。
- 灵活性和可维护性:每层可以独立开发和测试,便于维护和升级。
- 可重用性:某些层次(如数据访问层)可以在不同的应用程序间重用。
- 易于测试:每层可以独立进行单元测试和集成测试。
然而,分层架构也可能导致性能问题,因为每层之间的调用会增加处理时间。因此,在设计时应权衡分层带来的优势和可能的性能开销。
1.2 OSI参考模型
-
物理层(Physical Layer):
- 负责在物理媒介上实现数据的传输。
- 包括定义电气信号、光信号、物理连接器和物理拓扑结构。
- 例如,RJ45连接器、光纤、无线频率等。
-
数据链路层(Data Link Layer):
- 负责在相邻节点之间的可靠链接。
- 处理帧的传输,包括帧同步、差错控制和流量控制。
- 包括点对点协议(PPP)、以太网(Ethernet)和无线局域网(WLAN)等协议。
-
网络层(Network Layer):
- 负责数据包从源到目的地的传输和路由选择。
- 包括IP(Internet Protocol)、ICMP(Internet Control Message Protocol)和路由协议。
- 负责寻址和路由,确保数据包能够找到正确的路径从源头到达目的地。
-
传输层(Transport Layer):
- 提供端到端的数据传输服务。
- 确保数据的完整性、顺序和可靠性。
- 包括TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)。
-
会话层(Session Layer):
- 建立、管理和终止应用程序之间的会话。
- 负责建立检查点和恢复方案,以确保会话在通信过程中的可靠性。
-
表示层(Presentation Layer):
- 确保从应用程序流动的数据在网络上的其他系统上可以被读取。
- 处理数据格式化、转换和加密。
- 包括数据压缩和解压缩、数据加密和解密等。
-
应用层(Application Layer):
- 为应用软件提供网络服务。
- 包括最接近用户的应用程序,如Web浏览器、电子邮件客户端和文件传输协议(FTP)。
通俗的来讲,一个完整的通信过程是这样的:
应用层:
应用层是面向用户的,也就是说你使用的微信、QQ等,其实都是基于应用层的软件,你看到的图片、视频、文字等也是应用层的数据;
表示层:但是,不管是什么样的数据,对于计算机来说,都只是一串代码而已。表示层的作用,就是计算机使用计算机的编码,把应用层的图片、声音、文字表现出来。
表示层常见的协议有jpeg(图片编码方式),mp3(声音编码方式),ascii(文字编码方式)等。
会话层:我们平时会发现一个问题:使用QQ是无法直接分享抖音的内容的,淘宝购买的东西也不能使用微信支付,在这里就是淘宝app和微信app之间因为竞争关系,人为禁止互通的原因。
其实淘宝和微信都在Internet上,从网络角度来看是可以互通的,只是从软件的设计上,禁止了互通。
从另一个角度,用qq号可以登录腾讯出品的所有游戏,用支付宝账号也可以登录阿里的所有产品。
所以会话层的作用也就是一句话------两个应用能否对接
传输层:上三层的重点在app开发,从传输层开始,重点就在网络通信上了。
传输层有两个作用,首选会根据情况,选择跑的的快但可能丢包的udp协议,或者慢一点但是更稳定的tcp
例如你在网上看到一张图片,这个照片属于一个"文件",文件在传输的时候如果有部分数据丢失或出错,会导致整个文件都损坏看不到。
通常为了保证文件传输的完整性,我们会选择使用tcp协议,tcp会对所发的每个数据包进行确认,只有对方真的收到了,才算发送成功。
另外一种情况,如果你需要进行视频通话,视频聊天发送的数据不是一个本来存在的固定的文件,而是"边采集边发送",所以没有文件完整性一说,且视频聊天时候对延迟要求很高,可以接受数据少量丢失,但不能接受延迟,所以这时会采用udp作为传输层协议
传输层除了负责选择tcp还是udp,还会给数据包打上端口号:
举例:我只有一个ip,但我同时登录了qq、微信、bilibili三个应用,那么现在,就有必要给数据包打上不同的端口号,来识别这个数据包属于哪个应用
常见端口号有:
- 80:http协议,也就是浏览网页的数据包
- 443:http协议,也就是浏览安全加密网页的数据包
- 4000::qq的数据包
当然,一些恶意病毒通过网络传播时,也会有他们的端口号,防范这些病毒入侵,可以在防火墙封禁掉这些端口号。如勒索病毒的端口号是135、139、445等。
总结:传输层的作用是选择tcp或udp连接,并且给数据打上端口号。
网络层:
经过前面的工作,其实你的聊天内容还没有发送出去,只是经过了编码,并打上了端口号,但并没有说这个包要往哪发送。
接下来就是网络层的工作,网络层会给数据包打上ip地址,ip地址是互联网地址,类似于发快递时的收件人/发件人地址,有了这个地址,就可以远跨重洋将数据包发往全世界任何一个目的地。
有一个叫路由器的网络设备,是工作在网络层的,路由器相当于快递公司的各个节点,用来根据ip地址来转发各种各样的数据包。
总结:网络层的作用是给数据包打上ip地址,并且进行路由转发。
数据链路层:网络层的路由器用来连接各个网段,可以理解为,快递公司的大卡车负责把快递运到各个派送点,但是快递公司的大卡车并没有直接送到收件人的手里。
那么谁最终把快递包送到收件人手里呢,当然是快递小哥。
在网络通信中,有个叫交换机的设备,也是负责最终把数据包交给接收人。
交换机通过mac地址来识别各个终端(电脑、手机等),会记录下每个mac连在自己的哪个接口上,然后把数据包迅速发出。
Mac地址在电脑或手机出厂时就有了,当连接到网络中时,交换机会自动学习到。
总结:数据链路层的工作就是给数据包打上mac地址,然后交换机进行高速的交换转发。
物理层:顾名思义,物理层的作用就是定义怎么用物理信号来表示数据。
比如为什么网线是8根小线组成的而不是6根,wifi的电磁波频率为什么是2.4G和5G而不是别的,这些都是ieee(电气和电子工程师协会)规定的标准,大家都按照这个来就可以了
1.3 数据封装与解封装
数据的封装与解封装是计算机网络中两个重要的概念,它们描述了数据在OSI模型中各层之间传递时的包装和解包过程。
为什么需要封装与解封装数据?
- 确保数据完整性:每一层添加的信息有助于确保数据在传输过程中的完整性和准确性。
- 提供路由信息:封装过程中添加的地址信息确保数据能够找到正确的路径到达目的地。
- 错误检测和纠正:每一层都可以对数据进行错误检测和纠正,确保数据在传输过程中不会因为干扰而出错。
- 安全性:封装过程中可以添加安全措施,比如加密,以保护数据不被未授权的人访问。
- 灵活性和可维护性:每一层独立处理数据,使得网络设计更加灵活,也便于维护和升级。
- 服务多样性:不同的网络服务(如文件传输、电子邮件、网页浏览)可以通过封装和解封装来适应各自的需求。
总的来说,封装和解封装数据就像是给信件穿上多层保护衣,确保它能够安全、准确地到达目的地,并且让收信人能够正确理解和处理信件内容。
1.3.1 数据的封装过程
数据封装过程,在这里我们举例说明,以两台主机发送邮件为实例进行分析讲解,如下图所示:
例如,当你发送一封电子邮件时,数据封装的过程如下:
- 应用层(如SMTP协议)将邮件内容封装在邮件数据包中,并添加必要的邮件头信息。
- 表示层可能会对数据进行格式化,并添加表示层的协议头。
- 会话层建立通信会话,并添加会话层的协议头。
- 传输层(如TCP协议)添加端口号、序列号和确认应答机制,并封装数据传输单元。
- 网络层(如IP协议)添加源IP地址和目的IP地址,并进行路由选择。
- 数据链路层添加帧同步信息、物理地址(如MAC地址)和错误检测代码。
- 物理层最终通过物理媒介(如电缆、无线电波等)传输数据帧。
数据封装是指在发送数据时,每一层都会在数据包上添加自己的协议头信息,然后将整个包传递给下一层。这个过程从应用层开始,逐层向下进行,直到物理层。每一层添加的协议头通常包含该层所需的控制信息,如序列号、地址信息、错误检测和纠正数据等。
1.3.2 数据的解封装过程
数据被封装完毕通过网络传输到接收方后,将进入数据的解封装过程,是封装过程的一个逆过程,如下图所示:
继续上面电子邮件的例子,数据解封装的过程如下:
- 物理层接收数据帧,并将它们传递给数据链路层。
- 数据链路层处理帧同步和错误检测,移除自己的协议头,并将数据包传递给网络层。
- 网络层处理路由信息,移除IP头,将数据包传递给传输层。
- 传输层处理端口号和确认应答,移除TCP头,并将数据传递给会话层。
- 会话层结束会话,移除会话层协议头,将数据传递给表示层。
- 表示层处理数据格式化,移除表示层协议头,将数据传递给应用层。
- 应用层(如邮件客户端)最终接收到原始邮件内容。
数据解封装是封装的逆过程,它发生在数据包从接收方的物理层到达应用层的过程中。每一层在处理完数据包后,会移除自己添加的协议头信息,然后将剩余的数据包传递给上一层,直到最终应用层接收到原始数据。
最终,各层间的数据通信过程应该如下图所示。
二、TCP/IP协议
2.1 TCP/IP模型与OSI模型对比
OSI模型
- 七层结构:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
- 概念性:OSI模型是一个理论上的模型,用于教学和概念理解,它详细定义了每一层的功能和协议。
- 标准化:由国际标准化组织(ISO)提出,旨在促进不同系统间的互操作性。
- 抽象:每一层都隐藏了下层的复杂性,为上层提供服务。
TCP/IP模型
- 四层结构:链路层、网络层(互联网层)、传输层、应用层。
- 实用性:TCP/IP模型是基于实际的互联网协议族,它描述了互联网上的实际通信过程。
- 简化:TCP/IP模型将OSI模型的七层简化为四层,合并了一些功能相近的层次。
- 实际应用:TCP/IP模型是互联网的基础,广泛用于实际的网络通信中。
对比
- 层次数量:OSI模型有七层,而TCP/IP模型有四层。
- 抽象程度:OSI模型更抽象,每一层都定义得非常清晰;TCP/IP模型更具体,每一层都与实际的协议紧密相关。
- 普及度:TCP/IP模型因为与互联网的实际运作紧密相关,所以在实际应用中更为普及。
- 会话层和表示层:在TCP/IP模型中,会话层和表示层的功能通常由应用层的协议来处理,或者由应用程序自己实现。
- 数据链路层和网络层:TCP/IP模型的链路层相当于OSI模型的数据链路层和物理层,而TCP/IP模型的网络层则对应OSI模型的网络层。
- 教学与实际:OSI模型通常用于教学,帮助学生理解网络通信的复杂性;TCP/IP模型则用于实际的网络设计和实现。
尽管存在这些差异,两个模型的基本原理是相似的,它们都描述了数据在网络中从源头到目的地的传输过程,并且都强调了分层架构的重要性。在实际的网络设计和讨论中,TCP/IP模型更为常用,因为它直接关联到互联网的实际运作。
2.2 TCP/IP协议族组成
TCP/IP协议族,又称为互联网协议套件,是一组用于实现网络通信的协议,它构成了互联网的基础。TCP/IP协议族包括了一系列的协议和标准,其中最核心的两个协议是传输控制协议(TCP)和互联网协议(IP)。
应用层
- HTTP (Hypertext Transfer Protocol):超文本传输协议,用于从网站传输超文本到本地浏览器的传输协议,默认端口号为80。
- HTTPS (HTTP Secure):HTTP的安全版本,通过SSL/TLS提供加密传输,默认端口号为443。
- FTP (File Transfer Protocol):文件传输协议,用于在网络上的计算机之间传输文件,通常使用端口号20(数据)和21(控制)。
- DNS (Domain Name System):域名系统,用于将域名转换为IP地址,没有特定的端口号,但通常使用53。
- SMTP (Simple Mail Transfer Protocol):简单邮件传输协议,用于发送电子邮件,通常使用端口号25。
- SSH (Secure Shell):安全外壳协议,用于安全地访问远程计算机,通常使用端口号22。
- TFTP (Trivial File Transfer Protocol):简单文件传输协议,用于在没有复杂认证的情况下传输文件,通常使用端口号69。
传输层
- TCP (Transmission Control Protocol):传输控制协议,提供可靠的、面向连接的传输服务,使用协议号6。
- UDP (User Datagram Protocol):用户数据报协议,提供不可靠的、无连接的传输服务,使用协议号17。
网络层
- ICMP (Internet Control Message Protocol):互联网控制消息协议,用于发送错误消息和操作信息,如ping命令。
- IP (Internet Protocol):互联网协议,负责数据包的寻址和路由。
- ARP (Address Resolution Protocol):地址解析协议,用于将IP地址解析为物理地址(如MAC地址)。
数据链路层
- 未具体提及协议,但通常包括MAC (Media Access Control) 子层协议,负责在相邻节点间的帧传输。
物理层
- 负责在物理媒介上实现数据的传输,包括电气信号、光信号、物理连接器和物理拓扑结构。
端口号和协议号
- 端口号是用于区分同一主机上运行的不同服务的逻辑概念,通常在传输层的TCP/UDP协议中使用。
- 协议号是用于区分不同网络层协议的数字,如TCP和UDP
三、抓包分析
3.1 抓包分析TCP/IP协议架构
对于抓包工具,这里介绍一款Kali中流畅运行的抓包工具------Wireshark。
Wireshark 是一个流行的网络协议分析工具,它允许用户捕获和分析网络上的数据包。这个工具对于网络管理员、安全专家和开发者来说非常有用,因为它可以帮助他们监控网络流量、诊断网络问题、测试网络应用和学习网络协议。
现在,我们来逐步学习并使用Wireshark,在部分kali虚拟机上,你可以在"嗅探/欺骗"中找到wireshark,如果 Wireshark 尚未安装在 Kali Linux 上,你可以通过以下命令安装它:
sudo apt-get update
sudo apt-get install wireshark
现在我们启动Wireshark,如果没有图形化页面可以使用命令打开,如果有图形化可以直接点击打开
在 Wireshark 界面中,选择要捕获数据包的网络接口。通常,无线网络和有线网络接口会列出。选择你想要的接口。
如何确定哪个接口与CentOS 7相连?
在 Wireshark 启动后,它会显示所有可用的网络接口列表。你可以通过在终端中运行ipconfig命令来查看这些接口的详细信息
或者在新版本的系统中,可能需要使用ip addr show
接下来我们需要识别接口,如果你的 Kali 机器通过有线方式连接到网络,通常你会看到一个名为
eth0
或enpXsY
(其中X
和Y
是数字)的接口。在某些系统中,它可能被命名为ens33
、eno1
等;如果你通过无线方式连接,你可能会看到一个名为wlan0
或wlpXsY
的接口。确定哪个接口与 CentOS 7 机器相连的一个好方法是查看它们的 IP 地址。如果你知道 CentOS 7 机器的 IP 地址,你可以在 Wireshark 中查看每个接口的详细信息,看看哪个接口的 IP 地址与 CentOS 7 机器的 IP 地址匹配。
点击"开始捕获"按钮(通常是一个鲨鱼鳍图标),Wireshark 将开始捕获选定接口上的所有数据包。
如果你想捕获特定类型的流量,可以使用 Wireshark 的过滤功能(可选,或者等待捕获完成后再过滤捕获到的信息也是一样的)。例如,如果你想捕获只与 CentOS 7 机器的 IP 地址相关的数据包,可以使用 IP 地址作为过滤器:
ip.addr == [CentOS_IP_Address]
//替换 [CentOS_IP_Address] 为 CentOS 7 机器的实际 IP 地址。
当你完成数据捕获后,可以点击"停止捕获"按钮(通常是一个红色方块图标)
使用 Wireshark 提供的工具和选项来分析捕获的数据包。你可以查看数据包的详细信息,包括每个 OSI 模型层的信息。
现在,以tomcat的分析举例,我们来完整过一下抓包工具的使用流程🌟
首先,确保 Tomcat 服务器正在CentOS 7上正常运行,并且有应用程序正在提供服务。确定 Tomcat 服务器的 IP 地址和端口号(默认是8080)
打开Wireshark,选择与 Tomcat 服务器相连接的网络接口(这里应该选择eth0)
你可以设置过滤器来只捕获与Tomcat相关的流量,例如,你只对HTTP流量感兴趣,可以使用:
tcp.port == 8080
点击"开始捕获"按钮,Wireshark 将开始捕获选定接口上的数据包。
这就说明Wireshark正处于监听状态中。
打开浏览器输入Tomcat服务器的IP地址和端口进行访问,可以看到在Wireshark中出现了许多的包
现在停止抓包,我们可以去找找我们想要的数据包进行分析了。
当然,如果在开始抓包之前没有设置过滤器,你可以在停止抓包后通过Wireshark的过滤功能来筛选特定的流量。Wireshark提供了强大的过滤语法,允许你对捕获的数据包进行复杂的查询和筛选。例如:
-
HTTP过滤:
http //过滤所有HTTP流量
http.request.method == "GET"
http.request.method == "POST" //过滤特定的HTTP方法(如GET或POST) -
过滤特定域名或URL
http.host == "www.example.com"
http.url == "/index.html" -
过滤特定状态码
http.response.code == 200
http.response.code == 404 //过滤特定的HTTP状态码(如200、404等) -
组合过滤器
你可以组合多个过滤器来创建更具体的过滤条件。例如,要过滤特定域名和GET方法的组合,可以使用:
http.host == "www.example.com" && http.request.method == "GET"
这里我直接过滤一下httpd
Wireshark中给我们列出了捕获到包的时间、源IP、目标IP、使用的协议以及一些其他信息。从上图中我们不难看出:与 Tomcat 相关的记录可能包括所有 HTTP 协议的记录,特别是那些涉及 "192.168.202.128" IP 地址的记录,在Info中也显示了命令与Tomcat有关。
现在,让我们来分析一下这些信息:
- 在上图中,有一个记录显示了 "192.168.202.128" 向 "172.16.130.174" 发送了一个 HTTP 请求("GET/HTTP/"),以及从 "172.16.130.174" 收到了一个 HTTP 响应("HTTP/1.1 200")。这表明 "192.168.202.128" 可能是运行 Tomcat 的服务器的 IP 地址,或者至少是与 Tomcat 服务器通信的客户端。而我们的CentOS地址正是172.16.130.174
- 使用的协议为 HTTP
- 总字节数为 397,表示整个数据帧的大小
- 捕获的接口为 Ethernet II。
- 源 MAC 地址为 VMware_4b:16:4f (00:0c:29:4b:16:4f),目的 MAC 地址为 VMware_e2:73:35 (00:50:56:e2:73)
- 源端口号为 43076,目的端口号为 8080(Tomcat 的默认端口)
- TCP 序列号为 1,确认号为 1,数据长度为 343 字节。
- TCP 头部长度为 20 字节。
- TCP 标志包括 PSH(推送)和 ACK(确认)
- 这是一个 HTTP GET 请求,因为数据包中包含 "GET/ HTTP/1.1"
- TCP 段长度为 343 字节
Wireshark中还有很多信息,你可以双击你想查看的数据包来查看。
四、数据链路层
4.1 数据链路层简述
数据链路层(Data Link Layer)是OSI模型的第二层,它在网络通信中扮演着至关重要的角色。这一层的主要功能是确保网络中相邻节点之间的可靠数据传输。数据链路层处理的是在两个直接相连的节点之间的帧传输,它在物理层提供的服务基础上,添加了必要的控制信息和协议,以确保数据的正确传输。
4.1.1 帧结构
在数据链路层,数据被封装成帧(Frame)进行传输。帧结构包含了多个部分,每个部分都有特定的功能。以太网(Ethernet)帧是最常见的数据链路层帧结构之一,其结构如下:
- 数据链路层的协议:MAC子层协议
- MAC子层协议:封装帧头和帧尾
- 帧结构的构成:MAC子层+上三层数据+FCS(帧校验序列)
- MAC子层头部包含:目标MAC地址(6 byte字节48bit)+源MAC地址(6字节)+类型(2字节,上一层是什么协议类型的数据)
- MAC地址:也称为物理地址,是一台PC的身份,是被固化到网卡的全球唯一标识
五、TCP/IP四层模型
5.1 TCP/IP协议族
TCP/IP协议是用于因特网通信协议的标准,只有遵守这个标准,计算机之间才能进行通信。
在 TCP/IP 中包含一系列用于处理数据通信的协议:
- TCP (传输控制协议) - 应用程序之间通信
- UDP (用户数据包协议) - 应用程序之间的简单通信
- IP (网际协议) - 计算机之间的通信
- ICMP (因特网消息控制协议) - 针对错误和状态
- DHCP (动态主机配置协议) - 针对动态寻址
TCP/IP是基于TCP和IP这两个最初的协议之上的不同的通信协议的大集合
TCP/IP协议族(Transmission Control Protocol/Internet Protocol Suite)是一组用于互联网通信的协议,它定义了电子设备如何在网络上进行数据交换。
TCP/IP网络模型适用于不同设备上进程间的通信,共分为四层分,从上到下分别是应用层、传输层、网络层、网络接口层
应用层(Application Layer)
应用层是最上层的,我们能直接接触到的层,我们日常所使用的软件都是在应用层上实现的。
应用层不关心数据是如何传输的,就和我们寄快递的时候只需要把包裹交给快递员,我们不关心包裹是如何运输的。
协议
应用层的协议包括HTTP、FTP、Telnet、DNS、SMTP等。
传输层(Transport Layer)
传输层是为应用层提供网络支持的,在传输层有两个传输协议,分别是TCP和UDP。
TCP(Transmission Control Protocol)
TCP的全称是传输控制协议,大部分应用传输层协议使用的都是TCP,TCP为了保证数据能够可靠的传输到目的地,有流量控制、超时重传、拥塞控制等特性。
UDP(User Datagram Protocol)
UDP全称是用户报文协议,UDP相对TCP来说就很简单,只负责发送数据包,至于数据包能否正常抵达目的地,UDP不能保证;但是换一个角度来说,UDP少干了这么多,那他的实时性相对TCP来说更好,传输效率也更高。
通常来说一台设备上会运行多个应用进程,为了区分数据要发送的具体进程,传输层中需要指定端口号来区分不同的进程和应用。
网络层(Internet Layer)
负责将数据从一个设备发送到另一个设备的并不是传输层,传输层设计的理念是,简单、高效、专注,实际场景中的网络环节错综复杂,网络层就来是负责数据实际传输。
网络层最常用的是IP协议(Internet Protocol),IP协议会将传输层的报文作为数据部分,再加上IP数据包组装成IP报文。
网络层负责将数据从一个设备传输到另一个设备,而为了确定目标设备,网络层需要有区分设备单的编号,这个编号就是IP地址。
对于IPv4协议,IP地址共32位(32个bit),共分成四段(例如:192.168.1.1),每段8位。如果只有单纯的IP地址,虽然做到了设备区分,但是殉职起来就特别麻烦,世界上那么多设备,一个个去匹配显然是非常不科学的。
因此需要借助子网掩码来将IP地址分为两种意义:
- 一个是网络号,负责标识IP地址是属于哪一个[子网]的;
- 一个是主机号,负责标识同一子网下的不同主机;
举个栗子,比如192.168.1.1/24,后面的/24表示的就是子网掩码255.255.255.0,255.255.255.0 二进制是「11111111-11111111-11111111-00000000」,其中共有24个1,为了简化子网掩码的表示,就用/24来代替。
网络号=IP地址按位与子网掩码
主机号=IP地址按位与子网掩码取反
网络接口层(Link Layer)
网络层生成完IP头部之后,接下来要交给网络接口层在IP头前面加上MAC头,并封装成数据帧(Data Frame)发送到网络上。
IP头中的接收方IP表示网络包的目的地,通过这个地址我们就可以判断要将包发送到那里,但是在以太网的世界中,这个思路行不通!
以太网是一种在局域网内,把附近的设备连接起来,使其可以互相通讯的技术。我们电脑上的以太网口、WiFi接口,以太网交换机、路由器上的千兆、万兆网口,还有网线,都是以太网的组成部分。
以太网判断网络包目的地的方式和IP不同,不需要采用互相匹配的方式才能在以太网中将包发往目的地,而MAC头就是干这个用的,所以在以太网进行通讯需要用到MAC地址。
MAC头是以太网使用的头,包含了发送方和接收方的MAC地址等信息,我们可以通过ARP协议获取对方的MAC地址。
所以网络接口层主要为网络提供链路级别的传输服务,负责在以太网、WiFi这样的底层网络上发送原始数据包,工作在网卡这个层次,使用MAC地址来别试网络中的设备
5.2 TCP三次握手
首先我们来熟悉几个缩写简称:
熟悉了上面几个标志位和序列号含义后,下面我们来看TCP的三次握手过程:
注意:
不管请求还是应答,都是带两种数据:请求号SYN/应答号ACK + 数据包报文号;
请求时要发请求号SYN,应答时要发送应答号ACK;在数据包传送时,发送方要发送当前数据包报文号seq和确认收到上一个数据包的确认报文号ack。
前期:
TCP服务器创建传输控制块TCB,进入监听LISTEN状态,准备接收请求
- 第一次握手:客户端发送请求(发送请求SYN+数据包当前的序列号seq,无需应答)
客户端创建传输控制块TCB,进入监听LISTEN状态。
设置SYN=1,表示这是握手报文,并发送给服务器
设置发送的数据包序列号seq=x
此时客户端处于同步已发送SYN-SENT状态
- 第二次握手:服务器回复确认(发送应答ACK+请求SYN,确认收到上一个数据包确认号ack+当前数据包序列号seq)
设置ACK=1,表示确认应答。
设置ack=x+1,表示已收到客户端x之前的数据,希望下次数据从x+1开始
设置SYN=1,表示握手报文,并发送给客户端
设置发送的数据包序列号seq=y
此时服务器处于同步已接收SYN-RCVD状态
- 第三次握手:客户端确认服务器的确认(发送应答ACK+确认收到上一个数据包的确认号ack+当前数据包序列号seq,连接已建立,无需请求)
设置ACK=1,表示确认应答。
设置ack=y+1,表示收到服务器发来的序列号为seq=y的数据包,希望下次数据从y+1开始
设置seq=x+1,表示接着上一个数据包seq=x继续发送
至此三次握手结束,连接建立
三次握手机制的作用:
1.为了阻止历史连接
若网络状况不好的时候,客户端发送的SYN信号未能及时传输给服务器。当网络恢复时已经失效的SYN信号又到达服务器。如果只有两次握手便可建立连接,那么此时客户端就不知道这个连接是不是已经失效了的历史连接,从而导致错误的发生。三次握手时,客户端便可以根据上下文来判断此次连接是否为历史连接,避免错误的发生。
- 为了避免服务器开启无用连接增加服务器开销
客户端设置了一个超时时间,超过了就重新发送一个TCP连接请求。如果没有第三次握手的话,服务端是不知道客户端是否收到服务返回的信息的,这样没有给服务器端一个创建还是关闭连接端口的请求,服务器端的端口就一直开着,等到客户端因超时重新发出请求时,服务器就会重新开启一个端口连接。那么服务器端上没有接收到请求数据的上一个端口就一直开着,长此以往,这样的端口多了,就会造成服务器端开销的严重浪费。
5.3 TCP四次挥手
TCP释放连接时,需要进行四次挥手:
在断开连接之前客户端和服务器都处于ESTABLISHED状态,双方都可以主动断开连接,以客户端主动断开连接为优
第一次挥手:
- 发起者:客户端(主动关闭方)
- 动作:客户端打算断开连接,会向服务器发送一个FIN报文段,其中FIN标记位被设置为1(表示这是一个释放连接的报文段),并指定一个序列号seq=u。
- 状态变化:客户端发送FIN报文段后,进入FIN_WAIT_1状态,等待服务器的确认。
- 理解:"我客户端没有数据要发给你了",但是如果你服务器端还有数据没有发送完成,则不必急着关闭连接,可以继续发送数据。
第二次挥手:
- 接收者:服务器(被动关闭方)
- 动作:服务器收到客户端的FIN报文段后,会发送一个ACK应答报文段给客户端,以确认收到客户端的FIN报文段。ACK报文段的确认序列号ack=u+1(即在客户端FIN报文段的序列号基础上加1,表示服务器已经准备好接收序列号为u+1及之后的报文段(尽管实际上它可能不再发送数据)
- 状态变化:服务器发送ACK后,进入CLOSE_WAIT状态。此时,TCP连接处于半关闭状态,即客户端到服务器的连接已经释放,但服务器到客户端的连接仍然保持开启,服务器仍然可以发送数据给客户端。
- 理解:收到消息后,告诉客户端,你的请求我收到了,但是我还没准备好,请继续你等我的消息。
第三次挥手:
- 发起者:服务器(此时也作为主动关闭方)
- 动作:当服务器完成数据发送并且也准备好关闭连接时,它会向客户端发送一个FIN报文段,其中FIN和ACK标记位都被设置为1(FIN表示释放连接,ACK表示确认收到之前的报文段),并指定一个序列号seq=v(注意这里的v可能与之前的序列号不同,因为它是服务器生成的)。
- 状态变化:服务器发送FIN后,进入LAST_ACK状态,等待客户端的确认。
- 理解:告诉客户端,好了,我这边数据发完了,准备好关闭连接了。
第四次挥手:
- 接收者:客户端
- 动作:客户端收到服务器的FIN报文段后,会发送一个ACK应答报文段给服务器,以确认收到服务器的FIN报文段。ACK报文段的序列号seq=u+1(与第二次挥手时发送的ACK报文段的序列号相同,表示这是对这个FIN报文段的确认),确认序列号ack=v+1(即在服务器FIN报文段的序列号基础上加1)。
- 状态变化:客户端发送ACK后,会进入TIME_WAIT状态,等待足够的时间(通常是2倍的MSL,即报文段最大生存时间)以确保服务器能够收到这个ACK报文段。之后,客户端从TIME_WAIT状态进入CLOSED状态,完成连接的关闭。而服务器在收到客户端的ACK报文段后,会立即从LAST_ACK状态进入CLOSED状态,完成连接的关闭。
- 理解:客户端收到FIN=N报文后,就知道可以关闭连接了,但是他还是不相信网络,怕服务器端不知道要关闭,所以发送ack=N+1后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。服务器端收到ACK后,就知道可以断开连接了。客户端等待后依然没有收到回复,则证明服务器端已正常关闭,那好,我客户端也可以关闭连接了。最终完成了四次握手。
5.4 TCP(传输控制协议)
TCP 用于应用程序之间的通信。TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,它工作在OSI(Open Systems Interconnection)模型的传输层。TCP协议由IETF(Internet Engineering Task Force,互联网工程任务组)的RFC 793文档定义,是互联网中广泛使用的网络通信协议之一。
TCP协议主要特点:
- 面向连接:在数据传送之前必须先建立连接,数据传送结束后要释放连接。这种连接是一对一的,因此TCP不适用于广播和多播。使用TCP协议通信的两端,必须都实现TCP协议。
- 可靠性:TCP通过校验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。当TCP发送一个段之后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
- 全双工通信:
单工:只能一个方向发送数据
双工:双方可以互相发送和传输数据
半双工:双方能够互相发送和传输数据,但是不能同时发送或传输
全双工:双方能互相发送和传输,并且可以同时发送
TCP允许通信双方的应用程序在任何时候都能发送数据。TCP连接的两端都设有缓存用于临时存放双向通信的数据。在发送时,应用程序在将数据传送给TCP的缓存后,就可以做自己的事,而TCP在合适的时候将数据传送给对方。TCP为了发送一个报文段,就创建一个报文段,并把它传递给IP层(网络层),而IP层则把TCP报文段封装到IP数据包中,然后通过网络发送出去。
- 面向字节流:TCP中的"流"(Stream)指的是流入或流出进程的字节序列。TCP把TCP连接作为一条字节流来发送报文段,TCP对字节流的内容不作任何解释。TCP对收到的数据仅仅是一连串毫无结构的字节流,TCP不保证接收方应用程序所收到的数据块与发送方应用程序所发出的数据块的界限相一致。
当你使用TCP发送数据时,你可以把数据想象成一股连续不断的水流,TCP会负责把这股水流完整地送到接收方,但接收方收到的数据可能并不是你发送时划分好的那些数据块,而是一段连续的数据流。接收方的应用程序需要自己去处理这段数据流,将其划分成有意义的数据块或消息。
5.5 UDP
UDP 用于应用程序之间的简单通信。
UDP协议定义了端口,同一个主机上的每个应用程序都需要指定唯一的端口号,并且规定网络中传输的数据包必须加上端口信息,当数据包到达主机以后,就可以根据端口号找到对应的应用程序了。UDP协议比较简单,实现容易,但它没有确认机制,数据包一旦发出,无法知道对方是否收到,因此可靠性较差,为了解决这个问题,提高网络可靠性,TCP协议就诞生了。
QQ、DNS解析、英雄联盟、堡垒之夜等使用的UDP协议,因为其无连接、无状态、不可靠但高效的特点
5.6 IP
IP 用于计算机之间的通信。
IP 是无连接的通信协议。它不会占用两个正在通信的计算机之间的通信线路。这样,IP 就降低了对网络线路的需求。每条线可以同时满足许多不同的计算机之间的通信需要。
通过 IP,消息(或者其他数据)被分割为小的独立的包,并通过因特网在计算机之间传送。
IP 负责将每个包路由至它的目的地。
5.7 TCP/IP
TCP/IP 意味着 TCP 和 IP 在一起协同工作。
TCP 负责应用软件(比如你的浏览器)和网络软件之间的通信。
IP 负责计算机之间的通信。
TCP 负责将数据分割并装入 IP 包,然后在它们到达的时候重新组合它们。
IP 负责将包发送至接受者。
六、三次握手包抓取
首先建立如下的eNSP实验拓扑图并启动:
配置服务器和客户机的IP
配置完IP后启动设备,继续配置服务,使服务器开启http服务,客户端可以访问:
选择抓包Ethemet1,查看结果