网络协议
本章重点
网络模型:分层的,写代码在应用层
协议中头部信息很重要
**HTTP **
get
和post
(要求说出区别)- 状态码(要求说出分类)
抓包(要求分析信息)
TCP
可靠传输(要求说出可靠连接原因)
面向连接:三次握手,四次挥手(要求说出)
确认机制
超时重传
拥塞控制
timewait
: 2MSLUDP
无连接,直接传输(不管到没到,不管出错没出错,不管丢没丢)
快
数据很大时,UDP不会切片,TCP会切片
网络层
IP地址 (局域网 / 公网)
IP协议 中转 (IP协议才是控制一个报如何在宏观的互联网中跳转)
IPV4 / IPV6
以太网
只研究当前计算机数据到下一跳的传输,其他不管
以太网帧按照
MAC地址
作为信息标准
其余都不用,了解即可
应用层 HTTP
GET
典型get请求示例
GET /search?q=example&page=1 HTTP/1.1
Host: www.example.com
完整的 URL 为:
https://www.example.com/search?q=example&page=1
请求行的构成:
请求方法
请求资源
请求协议
GET / HTTP/1.1
在这个请求中:
/search
是请求的路径。?q=example&page=1
是查询字符串,其中q
是参数,表示搜索关键词example
,page
是另一个参数,表示请求第 1 页的结果。Host: www.example.com
表示请求发送到的服务器。在浏览器中,访问这个 URL 就会触发一次
GET
请求,并将参数q
和page
通过 URL 传递给服务器。
get
和post
区别
请求方法
请求方法,顾名思义就是以何种请求方法向当前的地址发起请求。常见的请求方法有GET和POST两种。GET和POST请求方法主要的区别在于语义上面的不同。
//1, GET主要用来进行查询数据,POST主要用来进行提交数据。这才是GET和POST本质上的区别
//2, 至于请求参数的位置不同,不是GET和POST之间的本质区别,仅仅是浏览器的默认行为。对于浏览器来说,浏览器在发送GET请求时,会将请求参数附着在地址栏,也就是请求报文的请求资源后;发送POST请求时,请求参数会位于请求体中,但是这仅仅是浏览器的行为,不是两者之间的本质区别。
URL示例及解析
完整的 URL 示例:
https://www.example.com:8080/docs/page.html?id=123&category=books#section2
- 协议:
https
,表示安全的 HTTP 请求。- 域名:
www.example.com
,表示目标服务器地址。- 端口号:
:8080
,指定连接的服务器端口。- 路径:
/docs/page.html
,表示服务器上的资源位置。- 查询参数:
?id=123&category=books
,向服务器传递的参数。- 片段标识符:
#section2
,指示页面内的某个部分。
Referer的区别
- Referer: 包含一个URL,用户从该URL代表的页面出发访问当前请求的页面 (防盗链); 比如用户直接访问B页面,以及通过访问A页面,进而跳转至B页面,这两种方式都进入到B页面,那么两种方式在HTTP请求报文中有没有区别呢?
以下是chatgpt的回答在 HTTP 请求中,如果用户直接访问 B 页面和通过 A 页面跳转到 B 页面,这两种方式在请求报文中的区别主要体现在
Referer
(来源页)字段上。
用户直接访问 B 页面:
- 当用户在浏览器中手动输入 B 页面的 URL 或直接点击浏览器的书签进入 B 页面时,HTTP 请求中 不会包含
Referer
字段,因为这次请求没有来源页面。请求报文看起来会像这样:http复制代码GET /b-page HTTP/1.1 Host: www.example.com
通过 A 页面跳转到 B 页面:
- 当用户从 A 页面点击链接或通过其他方式跳转到 B 页面时,HTTP 请求中 会包含
Referer
字段,指示用户是从 A 页面过来的。Referer
字段会告诉服务器,B 页面的访问是从 A 页面触发的。请求报文看起来会像这样:http复制代码GET /b-page HTTP/1.1 Host: www.example.com Referer: https://www.example.com/a-page
区别总结:
- 直接访问 B 页面:
Referer
字段为空或不存在。- 从 A 页面跳转到 B 页面:
Referer
字段包含 A 页面的 URL。这种差异主要用于服务器分析请求来源,例如防盗链、流量统计等。
HTTP组成/方法/状态码
HTTP 请求报文由以下部分组成:
- 请求行(Request Line):
- 包含请求方法、URL 路径和 HTTP 版本号。
- 格式:
方法 路径 HTTP版本号
- 示例:
GET /index.html HTTP/1.1
- 请求头部(Request Headers):
提供关于客户端、请求和资源的信息,以键值对形式出现,头部字段和值之间用冒号
:
分隔。示例:
http复制代码Host: www.example.com User-Agent: Mozilla/5.0 Accept: text/html
- 空行:
- 用于分隔请求头部和请求体,空行本身不包含任何内容。
- 请求体(Request Body):
- 包含要发送给服务器的数据,通常在
POST
、PUT
请求中使用。GET
请求没有请求体。- 示例:在表单提交时,可能包含
key=value
这样的数据。
HTTP 响应报文由以下部分组成:
状态行(Status Line):
- 包含 HTTP 版本号、状态码和状态消息。
- 格式:
HTTP版本号 状态码 状态消息
- 示例:
HTTP/1.1 200 OK
响应头部(Response Headers):
提供关于服务器和返回数据的信息,同样以键值对形式出现。
示例:
http复制代码Content-Type: text/html Content-Length: 1234 Date: Tue, 21 Aug 2024 10:30:00 GMT
空行:
- 用于分隔响应头部和响应体。
响应体(Response Body):
- 包含服务器返回的实际数据,如 HTML 页面、图片、JSON 数据等。
- HTTP 常用方法
常见的请求方法有GET和POST两种。GET主要用来进行查询数据,POST主要用来进行提交数据。这才是GET和POST本质上的区别
此外,了解
PUT请求: 上传资源/数据 DELETE请求: 删除资源/数据 HEAD请求: 获取相应头信息 OPTIONS请求: 获取请求方式/测试链接
- HTTP 状态码
状态码: 比较常见的: 200 400段 500段
// 100: 临时响应(基本相当于废弃状态) // 200: 状态正常(请求响应成功) // 300: 重定向(http://bing.com/) // 404: 未找到(资源不存在) // 500: 服务器内部错误
https拓展
- 长连接
- 加密
了解即可
抓包
参考:
wireshark抓包新手使用教程 - 锅边糊 - 博客园 (cnblogs.com)
通过wireshark抓包分析TCP三次握手过程。尝试解读TCP协议的每一个字段,截图显示抓包结果。 61LinuxDay17 题目六
下面是详细过程
本电脑ip
192.168.2.33
百度的ip
183.2.172.185
(同一次操作,图中百度的ip却是211.69.173.189
。。。)**ps:**这里不知道为什么,在cmd中
ping www.baidu.com
得到的百度地址 和 用抓包工具WireShark抓到的destination不一致。但,下面的三次握手tcp 本质还是一样的。
- 第一次握手数据包
客户端发送一个TCP,标志位为SYN,序列号为0, 代表客户端请求建立连接。 如上图。
数据包的关键属性如下:
SYN :标志位,表示请求建立连接。
Seq = 0 :初始建立连接值为0,数据包的相对序列号从0开始,表示当前还没有发送数据
Ack =0:初始建立连接值为0,已经收到包的数量,表示当前没有接收到数据
- 第二次握手
服务器发回确认包, 标志位为 SYN,ACK. 将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即0+1=1, 如上图
数据包的关键属性如下:
[SYN + ACK] : 标志位,同意建立连接,并回送SYN+ACK
Seq = 0 :初始建立值为0,表示当前还没有发送数据
Ack = 1:表示当前端成功接收的数据位数,虽然客户端没有发送任何有效数据,确认号还是被加1,因为包含SYN或FIN标志位。(并不会对有效数据的计数产生影响,因为含有SYN或FIN标志位的包并不携带有效数据)
- 第三次握手
客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1, 如上图
数据包的关键属性如下:
ACK :标志位,表示已经收到记录
Seq = 1 :表示当前已经发送1个数据
Ack = 1 : 表示当前端成功接收的数据位数,虽然服务端没有发送任何有效数据,确认号还是被加1,因为包含SYN或FIN标志位(并不会对有效数据的计数产生影响,因为含有SYN或FIN标志位的包并不携带有效数据)。
传输层 TCP
tcp是可靠传输的
**可靠传输:**TCP协议的可靠性和可靠传输是靠序号和确认机制,以及重传机制保证的。
序号机制:
//TCP将整个数据流分成一个个的字节,并为每个字节分配一个序列号。
//连接建立时,TCP随机生成一个初始序列号(ISN)。这个序列号随着握手连接和数据传输逐字节递增。
//每个TCP报文段的序号代表了该报文段中第一个字节的序列号。
确认机制:
//TCP使用累积确认机制。当接收方收到一个报文段后,它会发送一个ACK报文段/确认报文,确认号设置为下一个期望接收的字节的序列号。eg: 如果接收方收到序号为N的报文段,并且该报文段包含100个字节的数据,则它会发送一个确认号为N+100的ACK报文段。
重传机制:
//如果发送方没有在超时时间内收到对某个报文段回传的确认报文段,发送方会假定该报文段已丢失或在网络中延迟,并重新发送该报文段。
//TCP也使用快速重传机制。即当发送方收到目标主机回传的对同一数据包的三个重复确认报文段时,它会立即重新发送该数据包,而不是等待超时。
TCP 通过以下机制保证数据的可靠传输:
- 序列号和确认机制:确保数据按顺序接收和发送,检测数据丢失。
- 超时重传:在丢失确认的情况下重发数据,确保传输成功。
- 校验和:检测数据在传输过程中是否出现损坏。
- 流量控制:根据接收方的能力调整发送速率,防止溢出。
- 拥塞控制:控制网络拥塞,优化传输性能。
- 可靠的连接建立与终止:确保连接的可靠性并避免数据丢失。
具体问chatgpt
建立连接 三次握手
客户端发送 SYN(synchronize)报文(客户端 -> 服务器,SYN):
- 客户端发送一个
SYN=1
的报文给服务器,表示客户端请求建立连接。该报文告诉服务器自己的初始序列号(Sequence Number,简称SEQ
)。服务器回应 SYN-ACK(服务器 -> 客户端,SYN-ACK):
- 服务器收到
SYN=1
的报文后,发送一个带有SYN=1
和ACK=1
的报文,表示同意连接,并对客户端的序列号进行确认,同时附上服务器的初始序列号。客户端发送 ACK:(客户端 -> 服务器,ACK):
- 客户端收到
SYN=1, ACK=1
报文后,向服务器发送确认报文发送ACK=1
的确认报文,表示收到了服务器的SYN
和序列号,确认建立连接。
结合讲义学习
断开连接 四次挥手
-
示意图
-
主动关闭方 被动关闭方 (Client) (Server) | | | --- FIN ---> (1) | // 主动方发送 FIN,表示不再发送数据 | | | (2) <--- ACK --- | // 被动方确认收到 FIN,发送 ACK | | | --- [等待数据] ---> | // 主动方进入 FIN_WAIT_2 状态,等待被动方发送数据 | | | (3) <--- FIN --- | // 被动方完成数据发送后,发送 FIN | | | --- ACK ---> (4) | // 主动方确认收到 FIN,发送 ACK | | | --- [TIME_WAIT] ---> | // 主动方进入 TIME_WAIT 状态,等待 2*MSL 时间 | | | | | --- [连接关闭] ---> | // 2*MSL 时间过后,主动方关闭连接
步骤解析
- 第一次挥手(Client 发送 FIN):
- 主动关闭方(Client)发送
FIN
报文给被动关闭方(Server),表示不再发送数据,但仍能接收数据。此时,Client 进入 FIN_WAIT_1 状态。
- 第二次挥手(Server 回复 ACK):
- 被动关闭方(Server)收到
FIN
后,发送一个ACK
报文,确认收到了 Client 的 FIN 请求。此时,Client 进入 FIN_WAIT_2 状态,而 Server 继续发送未完成的数据。
- 第三次挥手(Server 发送 FIN):
- 当 Server 完成所有数据的传输后,它会向 Client 发送
FIN
报文,表示它也打算关闭连接。此时,Server 进入 CLOSE_WAIT 状态。
- 第四次挥手(Client 回复 ACK):
- 主动关闭方(Client)收到 Server 的
FIN
报文后,发送ACK
报文确认,表示双方都完成了关闭操作。此时,Client 进入 TIME_WAIT 状态,并等待 2*MSL 时间。
-
TIME_WAIT 状态的意义
TIME_WAIT
状态是为了确保 Client 发出的最后一个ACK
确实到达 Server,防止 Server 由于没有收到ACK
而重发FIN
。如果在TIME_WAIT
阶段收到了重新发送的FIN
,Client 可以再次发送ACK
,确保连接正常关闭。- 此外,
TIME_WAIT
状态还能防止旧连接中的数据包对新连接产生干扰。如果 Client 在关闭后立刻发起新的连接,旧的延迟数据包可能会干扰新连接中的通信,TIME_WAIT
确保网络中的旧数据包有足够的时间过期。通过这个图解,可以直观地理解 TCP 的四次挥手过程以及为什么主动关闭方需要经历
TIME_WAIT
状态。这一过程确保了可靠的连接关闭,并且不会产生混乱的重叠数据包。
结合讲义学习
UDP
网络层IP
NAT
-
NAT/Network Address Translation技术是在网络之间进行网络地址转化的一种网络技术, 而对于我们来讲, 这个技术比较常用的地方在与路由器进行局域网IP端口和公网IP端口的转换.
//IPv4地址空间有限,而且在全球范围内已经枯竭。由于大量设备需要连接到互联网,IP地址短缺成为一个问题。NAT允许多个设备在局域网内使用相同的私有IP地址,只在路由器上使用一个公有IP地址来访问互联网。NAT有效地延长了可用的IPv4地址。 安全性
路由器具有NAT功能(在net转换的时候, 路由器会做什么)
// 当局域网内的设备发送数据包到互联网时,NAT路由器会修改数据包的源IP地址。它会将源IP地址从局域网内的私有IP地址更改为NAT路由器的公有IP地址。
// 因为局域网内多个不同私有IP的主机共享同一个公有IP地址,在进行NAT数据包转发的时候, 只把局域网IP转化为公网IP, 当数据响应回来的时候, 将无法区分时那个局域网主机发送的.
// 所以NAT还会执行端口转换PAT/Port Address Translation操作。NAT设备会分配不同的端口号给不同的局域网设备端口,以便唯一标识它们。
// 这就意味着,从局域网中发出的包, 传输层的报文头部(TCP/UDP)的`源端口`将会被修改, 网络层的报文头部(IP)的源IP地址将会被修改
// NAT设备除了进行数据替换, 它会维护一个转发表,用于跟踪内部设备的私有IP地址、端口号和相应的公有IP地址及端口号。用以, 当对应的数据包返回到NAT设备时, 能将它们正确路由回到发送设备。