网络编程基础概念介绍

2025-01-29 20:31
347
0

一、OSI七层模式

OSI 七层模型是由国际标准化组织(ISO)在 1984 年提出的开放式系统互联通信参考模型,是一个逻辑上的网络通信架构模型。

  • 应用层:为用户提供各种网络服务和应用接口,如 HTTP 协议用于网页浏览、SMTP 协议用于电子邮件发送、FTP 协议用于文件传输等。
  • 表示层:主要负责处理数据的表示和转换,确保不同系统之间能够正确地理解和处理数据。它包括数据的加密和解密、压缩和解压缩、字符编码转换等功能。
  • 会话层:主要负责建立、维护和管理会话连接。它允许不同主机上的应用程序之间进行会话,并提供会话的同步和恢复功能。
  • 传输层:负责在不同主机上的应用程序之间提供可靠或不可靠的端到端通信(TCP和UDP)。
  • 网络层:主要功能是进行逻辑地址寻址,实现不同网络之间的数据路由选择(路由器、交换机)。 
  • 数据链路层:将物理层接收到的原始比特流转换为数据帧,并进行错误检测和纠正,同时还负责介质访问控制。
  • 物理层:处理物理介质上的信号传输(以二进制形式在物理机器上实现传输)包括电缆、光纤、无线等介质。

如下列举了各层涉及的部分协议:

二、Socket技术

任何的编程语言都是支持socket(网络编程技术)技术开发,目的就是解决两个应用程序通讯的问题;注意socket不属于某种协议,只是网络编程技术。

Socket技术支持两种协议:TCP和UDP

TCP和UDP区别

  • TCP协议是一个面向连接可靠的协议,因为建立连接的时候必须通过三次握手才可以实现数据传输;所以数据不会丢失。应用场景:http协议、rpc框架
  • UDP协议面向无连接协议,udp在通讯的时候不需要接受对方存在,属于不可靠传输,可能存在丢包的问题。

三、TCP协议三次握手

三次握手主要目的:保证连接可靠。

3.1、三次握手流程

  • 第一次握手:客户端向服务器端发送代码SYN=1,随机产生一个数组SEQ=X,发送到服务器。
  • 第二次握手:服务器端确认收到SYN和SEQ,回复给客户端:ACK=x+1和SEQ=Y,Y也是随机数。此外,服务器会将控制位中的 SYN 和 ACK 位都设置为 1,分别表示这是一个同步响应包以及对客户端请求的确认。
  • 第三次握手:客户端接收SYN 和ACK值后,向服务器发送ACK=y+1.发送完毕后就可以开始建立连接。控制位中的 ACK 位会被设置为 1,表示这是一个确认包。

字段解释:SYN(建立连接)、ACK(确认标记)、FIN(终止标记)、SEQ(序列号)

图示:

以一个简单的比喻来理解三次握手:

我要去朋友家玩,我通过QQ先问朋友:“你在不在家?”这就是第一次握手。
朋友看到了QQ消息回复:“我在。”这就是第二次握手。
我看到朋友的回复后说:“那我过来找你玩。”这就是第三次握手。

3.2、控制位

在 TCP 协议中,控制位(Control Bits)是 TCP 首部中的一部分,用于控制 TCP 连接的建立、维护和关闭等操作,以及对数据传输进行管理和控制,常见的控制位包括 URG、ACK、PSH、RST、SYN 和 FIN 等,以下是具体介绍:

  • URG(Urgent):紧急指针标志位。当 URG = 1 时,表示本报文段中包含紧急数据,需要尽快处理。紧急数据的位置由紧急指针字段指出,它指向紧急数据的最后一个字节在本报文段中的偏移量。比如在某些实时控制或紧急消息传输场景中,发送方可以设置 URG 位来让接收方优先处理这些紧急数据。
  • ACK(Acknowledgment):确认标志位。若 ACK = 1,说明确认号字段有效,即该 TCP 报文段是对之前接收到的数据的确认。在三次握手中,第二次和第三次握手时 ACK 位都会被置为 1,用于确认对方发送的数据包。例如,服务器收到客户端的 SYN 包后,在发送的 SYN + ACK 包中,ACK = 1 表示对客户端 SYN 包的确认。
  • PSH(Push):推送标志位。当 PSH = 1 时,提示接收方应该尽快将这个报文段中的数据交付给应用层,而不是等到缓冲区满了再交付。比如在交互式应用中,用户输入一个命令后,希望尽快得到响应,发送方就可以设置 PSH 位,让接收方尽快处理并返回结果。
  • RST(Reset):复位标志位。若 RST = 1,表示出现了错误或异常情况,需要重置 TCP 连接。例如,当接收方收到一个序号严重错乱的数据包,或者连接出现故障时,就可能发送 RST = 1 的 TCP 报文段来强制关闭连接,然后重新建立连接。
  • SYN(Synchronize):同步标志位。在建立 TCP 连接时,SYN = 1 用于表示这是一个用于同步序列号的连接请求或响应。在三次握手的第一次和第二次握手中,SYN 位都会被置为 1,用于客户端和服务器之间同步序列号,以确保数据传输的顺序和准确性。
  • FIN(Finish):结束标志位。当 FIN = 1 时,表示发送方已经没有数据要发送了,请求关闭连接。在 TCP 连接关闭过程中,一方发送 FIN = 1 的报文段来告知对方自己的数据发送完毕,准备关闭连接。

四、TCP协议四次挥手

目的:可靠关闭连接

4.1、四次挥手的流程

第一次挥手:客户端向服务器发送FIN报文,表示不再发送数据,但仍可接收数据。

报文内容:

  • FIN=1(表示请求关闭连接)
  • Seq=u(u是客户端最后的序列号,随机生成)

第二次挥手:服务器收到FIN后,发送ACK报文,确认收到FIN。将控制位中的 ACK 位设置为 1,表示这是一个对 FIN 包的确认包。

报文内容:

  • ACK=1(控制位的ACK,表示确认)
  • Ack=u+1(确认号为客户端序列号u+1)
  • Seq=v(v是服务器当前的序列号,随机生成)

第三次挥手:服务器完成数据发送后,向客户端发送FIN报文,表示不再发送数据。

报文内容:

  • FIN=1(表示请求关闭连接)
  • ACK=1(控制位的ACK,表示确认)
  • Seq=w(w是服务器新的序列号)
  • Ack=u+1(确认号仍为u+1,与第二次挥手一致)

第四次挥手:客户端收到FIN后,发送ACK报文,确认收到FIN。

报文内容:

  • ACK=1(控制位的ACK,表示确认)
  • Seq=u+1(客户端新的序列号)
  • Ack=w+1(确认号为服务器序列号w+1)

图示:

TIME_WAIT状态:客户端在发送最后一个ACK后,会等待2MSL时间,以确保服务器收到ACK,防止旧的重复报文干扰新连接。

服务端和客户端都可以发起第一次挥手。TCP连接是双向的,双方都可以主动发起关闭连接的请求。

谁先发起的FIN谁就是主动方,主动关闭方会经历FIN_WAIT_1、FIN_WAIT_2和TIME_WAIT状态。被动关闭方会经历CLOSE_WAIT和LAST_ACK状态。

也以一个比喻来理解四次握手:

从朋友家离开,我跟朋友说:“我要走了。” 这是第一次挥手
朋友听到后回复:“稍等一下,我送你到门口。”(朋友把手上的事情做完)这是第二次挥手
到了门口朋友挥手送别:“再见,下次再来玩。” 这是第三次挥手
我听到后回复:“好的,再见。”这是第四次挥手。

五、HTTP协议

HTTP协议是对TCP的封装。

5.1、http协议特征

  1. 无状态,没有记忆的会话
  2. 请求与响应模型
  3. 简单快捷
  4. 可以灵活传输任何类型

5.2、HTTP请求数据包格式

  • 请求行:由请求方法、URL 和协议版本组成,例如GET /index.html HTTP/1.1,其中GET是请求方法,/index.html是请求的资源路径,HTTP/1.1是协议版本。
  • 请求头:包含了关于请求的一些附加信息,如User-Agent(浏览器类型等信息)、Accept(可接受的响应内容类型)等。每个请求头由字段名和值组成,中间用冒号分隔,例如User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36。
  • 空行:用于分隔请求头和请求体,是一个必须的换行符。
  • 请求体:通常在POST、PUT等请求方法中携带数据,比如表单数据username=admin&password=123456。

以下是请求数据包示例:

POST /login HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 26

username=admin&password=123456

5.3、HTTP响应数据包格式

  • 状态行:由协议版本、状态码和状态码描述组成,例如HTTP/1.1 200 OK,200是状态码,表示请求成功,OK是对状态码的文本描述。
  • 响应头:包含了关于响应的一些信息,如Content-Type(响应内容的类型)、Content-Length(响应内容的长度)等,格式与请求头类似。
  • 空行:同样用于分隔响应头和响应体。
  • 响应体:包含了服务器返回给客户端的数据,比如一个 HTML 页面的内容或者 JSON 格式的数据等。

以下是响应数据包示例:

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 34

{"message": "Hello, World!"}

5.4、HTTP协议版本介绍

HTTP/0.9:1991 年发布,是最初的 HTTP 版本,只支持GET请求,服务器只能回应 HTML 格式字符串,没有头部信息和状态码。

HTTP/1.0:1996 年发布,引入了多种请求方法如POST、HEAD等,支持传输多种类型数据,还引入了请求头、响应头、状态码和缓存等概念,但使用非持久连接,每次请求都需重新建立连接,效率较低,也不支持管道化。

HTTP/1.1:1997 年发布,默认建立持久连接,能很好地配合代理服务器工作,引入了管道机制,允许在一个连接上发送多个请求,增加了PUT、PATCH、OPTIONS、DELETE等请求方法,是多年来的主流协议。

HTTP/2:2015 年发布,是一个彻底的二进制协议,头信息和数据体都采用二进制,统称为 “帧”,引入了头信息压缩机制,支持多路复用和服务器推送,解决了 HTTP/1.1 的一些性能瓶颈问题。

HTTP/3:2020 年发布,基于 UDP 协议的新一代 HTTP 协议,基于 UDP 之上的 QUIC 协议,取代 TCP 作为传输层协议,旨在进一步提升性能和安全性,尤其是在高延迟、高丢包的网络环境下表现更优。

 

 

全部评论