IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 计算机网络协议(HTTP TCP UDP) -> 正文阅读

[网络协议]计算机网络协议(HTTP TCP UDP)

一、HTTP协议

1、http定义

HTTP(HyperText Transfer Protocol,超文本传输协议)是一个请求 - 响应(Request to Response)协议,位于网络模型的应用层,基于传输层的?TCP?协议。

2、http请求-响应模型

其次,HTTP 报文是在客户端和服务器端传输的数据报文,由起始行(Start Line)、请求头部(Request Header)和请求主体(Request Body)构成,从类型上分为请求报文(Request Message)和响应报文(Response Message)。

HTTP 报文格式

3、http请求方法?

序号方法说明
1GET请求服务器上的资源,请求体不会包含请求数据,参数可以通过 URL 传输。
2POST用户传输信息到服务器,请求方式类似 GET 请求,比如提交表单。
3PUT用户传输信息到服务器,请求方式类似 POST 请求,比如提交文件。
4DELETE请求服务器删除某个资源,和 POST 请求作用相反。
5OPTIONS查询 URL 支持的 HTTP 方法。
6HEAD请求方式类似 GET 请求,但是服务器不会返回消息体,一般用于检查网页是否被修改、检查 URL 是否有效。
POST 和 GET 方法POST 和 GET 方法进行对比

(1)GET 请求主要是为了从服务器获取资源,POST 请求主要是为了向服务器发送资源。

(2)GET 请求是通过 URL 传参,形式是?field = value,多个参数使用?&?进行分割,例如?http://127.0.0.1/login?username=xiaoming&password=123456。POST 请求是通过请求体传参,即信息存放到 Request Body 中。

(3)GET 请求传输的信息量少,POST 请求能够传输的信息量多。

(4)GET 请求参数在 URL 明文,容易被爬虫直接获取,POST 请求参数不直接可见,安全性更高,例如在表单提交密码时,必须使用 POST 请求。

4、http状态码

状态码状态码对应英文说明
100Continue服务器收到了客户端的请求行和头部信息,告诉
客户端继续发送数据部分。
200OK请求成功。
301Permanently Moved资源被永久转移了,请求将被重定向。
302Temporarily Moved资源被临时转移了,请求将被重定向。
404Not Found资源没找到。
500Internal Server Error服务器内部错误。

?二、传输层TCP / UDP协议

1、TCP与UDP的区别

TCP(Transmission Control Protocol,传输控制协议)UDP(User Datagram Protocol,用户数据报协议)
是否连接面向连接无连接
传输方式面向字节流:直接以字节流形式传输面向报文:对于应用程序交付的数据,添加首部之后就交付给 IP 层
首部格式20 个字节的固定首部只有 8 个字节
是否可靠可靠传输,依靠流量控制和拥塞控制不可靠传输
连接对象个数一对一连接支持一对一(点到点),一对多以及多对多传输
适用场景要求可靠传输的场景,例如发送邮件和传输文件对可靠性要求低,效率要求高的场景,例如 QQ 的视频通话

总结:

  • TCP 协议面向连接并且可靠,UDP 协议无连接并且不可靠;
  • 虽然 UDP 协议不可靠,但是在对数据完整性要求低,对传输速度要求高的场景,可以适用 UDP 协议。

2、TCP三次握手

tcp如何建立链接,三次握手过程

过程解析

首先从行为上分析,TCP 建立连接需要发送三次报文,也就是 "三次握手" 的过程。

我们定义发送报文的一方是客户端,接收报文的一方是服务器端。

首先服务器端处于监听(LISTEN)的状态,否则不会收到客户端发来的请求。

(1)第一次握手:客户端往服务器端发送一个请求建立连接报文,报文首部 SYN 标志位 = 1,给定一个初始的 Seq 序号 x。之后客户端进入 SYN_SEN(同步发送)状态;

(2)第二次握手:服务器端收到请求报文,如果同意建立连接,则向客户端发送确认报文。确认报文中 SYN 标志位 = 1,ACK 标志位 = 1,同时给定一个 Seq 序号 y,Ack 确认号 x+1,之后服务器端进入 SYN_RCVD(同步已发送)状态;

(3)第三次握手:客户端收到来自服务器端的确认报文之后,还需要向服务器端发送确认报文,报文首部 ACK 标志位 = 1,Ack 确认号为 y+1,发送之后客户端进入 ESTABLISHED(已建立连接)的状态。服务器端收到确认报文后,也会进入 ESTABLISHED 状态,在此之后,客户端和服务器端可以开始 TCP 通信了。

3、TCP三次握手的必要性

首先从定性角度来看,分析三次握手每个步骤的意义:

(1)第一次握手:客户端发送报文,服务器端接收报文,如果成功接收,说明客户端的发送能力、服务器端的接收能力符合预期;

(2)第二次握手:服务器端发送报文,客户端接收报文,如果成功接收。从客户端的角度来看:客户端的发送和接收能力符合预期,服务器端的发送和接收能力符合预期,可以建立连接。但是从服务器端的角度来看:客户端的发送能力符合预期(第一次握手),服务器端的接收能力符合预期(第二次握手),但是因为收不到客户端的反馈(无法获知第二次握手的报文是否成功抵达客户端),那么只能得出服务器端的发送能力和客户端的接收能力不一定符合预期的结论;

(3)第三次握手:客户端发送报文,服务器端接收报文,如果接收成功,从服务器端的角度来看:客户端的报文接收能力以及服务器端的报文发送能力都符合预期。

经过三次握手的过程,客户端和服务器端都明确对方以及自己能成功接收和发送信息,所以就可以开始正常通信。

如何两次握手情况会是怎样?分析如下:

如果 TCP 只有两次握手,如果服务器端发送的第一个请求建立连接的报文在某个网络节点长时间阻塞,等到连接释放之后才抵达服务器端。本来这是一个早就失效的报文,但是服务器端收到这个失效的请求建立连接报文之后,会误以为是客户端需要建立一个新的连接请求,于是向客户端发送 ACK 确认报文,同意建立连接,这时候因为已经完成了两次握手,所以新的连接就会建立成功,这种情况显然不符合预期。

如果是三次握手,客户端不会向服务器端发送 ACK 确认报文,所以服务器端超过最长等待时间后,会认为客户端没有要求建立请求,这个无效报文最终会失效。

4、TCP四次挥手

上面分析了 TCP 建立连接的过程,既然有建立连接,对应的也有断开连接。数据传输完成之后,客户端和服务器端保持通信状态会占用资源开销,所以需要断开连接,TCP 协议中断开连接也被称为 TCP 四次挥手。

(1)四次挥手过程模型图

四次挥手过程分析如下:

首先从行为上分析,TCP 断开连接总共需要发送四次报文,也就是 "四次挥手" 的过程。

我们定义发送报文的一方是客户端,接收报文的一方是服务器端。

上一章节中已经对三次握手过程做出了分析,在建立连接后到传输数据的整个过程,客户端和服务器端均处于 ESTABLISHED(监听)状态,之后四次挥手的过程如下:
(1)第一次挥手:客户端发送一个请求结束报文,其中 FIN 标志位设置为 1,报文中给定一个序列号 u,报文内容是?FINbit=1 seq=u,发送之后主动进入 FIN_WAIT 状态,等待服务器端的确认报文;

(2)第二次挥手:服务器端收到 FIN 报文,会发送 ACK 确认报文,并且把客户端发送的序列号加一作为确认报文的确认号,表示已经收到了客户端的报文,所以报文内容是?ACKbit=1 seq=v ack=u+1,之后进入 CLOSE_WAIT(关闭等待)状态。此时会通知应用层的进程,客户端已经不会再发送数据了。此时连接处于半关闭状态,如果服务器端发送数据,客户端还是需要接收。

客户端收到第二次挥手的报文后,会进入 FIN_WAIT_2(等待结束)状态,等待服务器发送最后的终止连接报文;

(3)第三次挥手:服务器端把最后的数据发送之后,就开始向客户端发送请求结束报文,FIN 标志位设置为 1,确认号设置为 u+1,比较特殊的一点是报文中 ACK 标志位也是 1,报文内容是?FINbit=1 ACKbit=1 seq=w ack=u+1,发送之后服务器端进入 LAST_ACK(最终确认)状态,等待客户端的确认报文。

(4)第四次挥手:客户端收到服务器的请求断开连接报文后,必须还要发出一个确认报文,ACK 标志位设置为 1,并且序列号同上一报文的确认号,确认号同上一报文的序列号加一,报文内容是?ACKbit=1 seq=u+1 ack=w+1,之后客户端进入 TIME_WAIT(时间等待)状态。因为不会再收到服务器端的报文,所以等待 2*MSL(最大报文段生存时间)之后,自动进入 CLOSED(关闭)状态。

服务器端在收到客户端的第四次挥手报文后,立即进入 CLOSED(关闭)状态,表示结束本次 TCP 连接。

在向面试官分析整个流程的时候,我们可以将四次报文中的第一次和第二次看作一个整体,即是客户端发送请求结束报文以及收到对应响应。第三次和第四次又是一个整体,即服务器端发送请求结束报文并且收到客户端的响应。

(2) 四次挥手的必要性

前置说明:TCP 是双向通信的协议,客户端可以发送和接收数据,服务器端也可以发送和接收数据,也就是全双工通信模式。

第一次挥手时,服务器端收到了客户端的 FIN 请求结束报文,但是因为应用层的进程可能还需要传输一些数据,不能立即关闭 SOCKET,所以只能先给客户端发送一个 ACK 确认报文,让客户端有 "心理准备"。之后服务器端进入 CLOSE_WAIT 状态,这个状态是为了处理最后的一些数据,等待这些数据也传输完毕之后,服务器端再发送 FIN 请求结束报文,到这里就已经有三次挥手的步骤了。最后,因为服务器端也需要感知第三次挥手的报文是否成功传输到客户端,所以客户端还需要第四次挥手的报文,来作为确认。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-08-14 14:29:09  更:2021-08-14 14:32:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 19:25:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码