计算机网络常考协议(HTTPHTTPs、TCP/UDP、DNS)
文章目录
- HTTP&HTTPs
- (1)HTTP 1.0 和 HTTP 1.1 之间有哪些区别?
- 补充:常见的HTTP请求方法
- (2)HTTP 1.1 和 HTTP 2.0 之间有哪些区别?
- 补充:队头阻塞
- 补充:Websocket和HTTP的联系和区别
- (3)HTTP 2.0 和HTTP3.0之间有哪些区别?
- (4)HTTP和HTTPs的区别
- 补充:HTTPs通信(握手过程)
- TCP&UDP
- (1)TCP和UDP的区别
- 补充:UDP协议为什么不可靠?
- (2)TCP三次握手
- 补充:为什么不能两次握手?
- (3)TCP四次挥手
- DNS域名解析系统
- (1)DNS作用
- (2)各级域名
- (3)域名服务器
- (4)域名解析过程
HTTP&HTTPs
(1)HTTP 1.0 和 HTTP 1.1 之间有哪些区别?
- 连接方面:http1.0 默认使用非持久连接,而 http1.1 默认使用持久连接。http1.1 通过使用持久连接来使多个 http 请求复用同一个 TCP 连接,以此来避免使用非持久连接时每次需要建立连接的时延。
- 资源请求方面:在http1.0 中,存在浪费带宽的现象,如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,http1.1 则在请求头引入了 range头域,它允许只请求资源的某个部分,即返回码是 206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
- 缓存方面:在 http1.0 中主要使用 header 里的 If-Modified-Since、Expires 来做为缓存判断的标准,http1.1 则引入了更多的缓存控制策略,例如 Etag、If-Unmodified-Since、If-Match、If-None-Match等可供选择的缓存头。
- http1.0 中认为每台服务器都绑定一个唯一的IP 地址,因此,请求消息中的 URL 并没有传递主机名。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机,并且它们共享一个IP地址。http1.1 中新增了 host 字段,用来指定服务器的域名。因此有了 host 字段,这样就可以将请求发往到同一台服务器上的不同网站。
- http1.1 相对于 http1.0 还新增了很多请求方法,如 PUT、HEAD、OPTIONS 等。
补充:常见的HTTP请求方法
GET: 向服务器获取数据 POST:将实体提交到指定的资源,通常会造成服务器资源的修改 PUT:上传文件,更新数据 DELETE:删除服务器上的对象 HEAD:获取报文首部,与GET相比,不返回报文主体部分 OPTIONS:询问支持的请求方法,用来跨域请求 CONNECT:要求在与代理服务器通信时建立隧道,使用隧道进行TCP通信 TRACE: 回显服务器收到的请求,主要⽤于测试或诊断
区别 | HTTP1.0 | HTTP1.1 |
---|---|---|
连接 | 非持久连接 | 持久连接 |
资源请求 | 服务器返回全部资源,不支持断点续传 | 允许只请求资源的某个部分 |
缓存 | 主要使用 header 里的 If-Modified-Since、Expires | 更多的缓存控制策略,如 Etag、If-Unmodified-Since、If-Match、If-None-Match等。 |
新增 | / | host字段;请求方法(如PUT、HEAD、OPTIONS) |
(2)HTTP 1.1 和 HTTP 2.0 之间有哪些区别?
-
二进制协议:在 HTTP/1.1 版中,报文的头信息必须是文本(ASCII编码),数据体可以是文本,也可以是二进制。HTTP2.0则是一个彻底的二进制协议,头信息和数据体都是二进制,统称为"帧",可以分为头信息帧和数据帧。 帧的概念是它实现多路复用的基础。
-
多路复用: HTTP2.0 实现了多路复用,HTTP2.0 仍然复用 TCP 连接,但是在一个连接里,客户端和服务器都可以同时发送多个请求或回应,而且不用按照顺序一一发送,这样就避免了"队头堵
塞"的问题。补充:队头阻塞
队头阻塞是由 HTTP 基本的“请求 -
应答”模型所导致的。HTTP规定报文必须是“一发一收”,这就形成了一个先进先出的队列。队列里的请求是没有优先级的,只有入队的先后顺序,排在最前面的请求会被最优先处理。如果队首的请求处理的太慢而耽误了时间,那么队列里后面的所有请求也不得不跟着一起等待,结果就是其他的请求承担了不应有的时间成本,造成了队头堵塞的现象。 -
数据流: HTTP2.0引入了数据流的概念。因为 HTTP2.0 的数据包是不按顺序发送的,同一个连接里面连续的数据包,可能属于不同的请求。因此,必须要对数据包做标记,指出它属于哪个请求。**HTTP2.0将每个请求或回应的所有数据包,称为一个数据流。每个数据流都有一个独一无二的编号。**数据包发送时,都必须标记数据流 ID ,用来区分它属于哪个数据流。
-
头信息压缩: HTTP2.0 实现了头信息压缩。因为 HTTP 1.1 协议不带状态,每次请求都必须附上所有信息。所以,请求的很多字段都是重复的,比如 Cookie 和 User Agent ,一模一样的内容,每次请求都必须附带,这会浪费很多带宽,也影响速度。HTTP2.0 对这一点做了优化,引入了头信息压缩机制。一方面,头信息使用 gzip 或 compress 压缩后再发送;另一方面,客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就能提高速度了。
-
服务器推送:即HTTP2.0 允许服务器未经请求,主动向客户端发送资源。可以提前给客户端推送必要的资源(静态资源),这样就可以相对减少一些延迟时间。Note:HTTP2.0,服务器主动推送的是静态资源,和 WebSocket 以及使用 SSE 等方式向客户端发送即时数据的推送是不同的。
补充:Websocket和HTTP的联系和区别
- 联系: - 都是基于TCP协议的 - 都是可靠传输协议 - 都是应用层协议 - 区别: - websocket是持久连接,http是短连接 - websocket对应的协议是 以ws、wss开头,http以http、https开头 - websocket是有状态的双向连接,http是无状态的单向连接 - websocket是可以跨域的
区别 | HTTP1.1 | HTTP2.0 |
---|---|---|
二进制协议 | 报文头信息是文本,数据体可以是文本、二进制 | 报文头信息、数据体必须是二进制 |
新增: | / | 多路复用、数据流、头信息压缩、服务器推送 |
(3)HTTP 2.0 和HTTP3.0之间有哪些区别?
- 基于的传输层协议不同:HTTP2基于TCP,HTTP3基于UDP。
- HTTP3.0基于UDP协议实现了类似于HTTP2.0基于TCP的多路复用、流量控制、拥塞控制等传输可靠性等功能,这套功能被称为QUIC协议。
- 建立连接时延不同:HTTP2.0基于TCP要通过三次握手建立连接,HTTP3.0基于UDP,可以使用0~1个RTT来快速握手,建立连接。
(4)HTTP和HTTPs的区别
- HTTP以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了web浏览器和服务器之间的传输报文,就可以直接读懂其中的信息(即存在信息窃听、信息篡改、信息劫持的风险),因此HTTP不适合传输一些敏感信息。HTTPs利用具有安全性的SSL/TLS(具有身份验证、信息加密和完整性验证功能)来加密传输数据,安全性较好。
- HTTP页面响应速度比HTTPs快。HTTPS协议需要CA证书,费用较高,而HTTP协议不需要。
- HTTP使用的端口号是80,HTTPs使用的端口号是443。
区别 | HTTP | HTTPs |
---|---|---|
传输内容 | 明文 | SSL/TLS加密(非对称加密) |
响应速度 | 快 | 慢 |
端口号 | 80 | 443 |
补充:HTTPs通信(握手过程)
TCP&UDP
(1)TCP和UDP的区别
区别 | TCP | UDP |
---|---|---|
是否连接 | 面向连接 | 面向无连接 |
连接对象个数 | 只能一对一通信 | 支持一对一、一对多、多对一、多对多通信 |
是否可靠 | 可靠传输(数据顺序和正确性,使用流量控制和拥塞控制 | 不可靠传输(不保证数据顺序和正确性),不使用流量控制和拥塞控制 |
传输方式 | 面向字节流 | 面向报文 |
首部开销 | 首部最小20字节,最大60字节 | 首部开销小,仅8字节 |
使用场景 | 实时应用,视频会议、直播 | 文件传输等要求可靠传输的应用 |
补充:UDP协议为什么不可靠?
1. 不保证消息交付:不确认,不重传,无超时
2. 不保证交付顺序:不设置包序号,不重排,不会发生队首阻塞
3. 不跟踪连接状态:不必建立连接或重启状态机
4. 不进行拥塞控制:不内置客户端或网络反馈机制
(2)TCP三次握手
三次握手是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。实质上其实就是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小信息。
- 客户端发起请求,SYN=1,seq=x
- 服务器响应请求,并发出新请求,SYN=1,ACK=1,seq=y,ack=x+1
- 客户端相应请求,并发送数据,SYN=1,ACK=1, seq=x+1,ack=y+1
具体三次握手过程如下:
- 第一次握手: 客户端向服务端发送连接请求报文段。该报文段中包含自身的数据通讯初始序列号。请求发送后,客户端便进入 SYN-SENT 状态。
- 第二次握手: 服务端收到连接请求报文段后,如果同意连接,则会发送一个应答,该应答中也会包含自身的数据通讯初始序列号,发送完成后便进入 SYN-RECEIVED 状态。
- 第三次握手: 当客户端收到连接同意的应答后,还要向服务端发送一个确认报文。客户端发完这个报文段后便进入ESTABLISHED 状态,服务端收到这个应答后也进入 ESTABLISHED 状态,此时连接建立成功。
补充:为什么不能两次握手?
三次握手主要是防止历史连接,两次握手无法判断当前连接是否是历史连接且客服端不响应服务器端发来的确认,浪费资源。
如果是用两次握手,则会出现下面这种情况:
- 客户端发出连接请求,但因连接请求报文丢失而未收到确认,于是客户端再重传一次连接请求,后来收到了确认,建立了连接,数据传输完毕后,就释放了连接。
- 客户端共发出了两个连接请求报文段,其中第一个丢失,第二个到达了服务端,但是第一个丢失的报文段只是在某些网络结点长时间滞留了,延误到连接释放以后的某个时间才到达服务端,此时服务端误认为客户端又发出一次新的连接请求,于是就向客户端发出确认报文段,同意建立连接。即服务器无法判断当前连接是否是历史连接。
- 此时服务端发出确认,就建立新的连接了,但客服端认为自己没有发送连接请求,因此忽略服务端发来的确认,也不发送数据,则服务端一直在等待客户端发送数据,浪费资源。
(3)TCP四次挥手
- 客户端发起结束请求,FIN= 1,seq=u
- 服务器端响应客户端的请求,并发出自己的数据,seq=v,ACK=1,ack=u+1
- 服务器端数据传输完毕,向客户端发起结束请求,FIN=1,seq=w,ACK=1,ack=u+1
- 客户端响应服务器端的请求,ACK=1,seq=u+1,ack=w+1
具体四次挥手过程如下:
- 第一次挥手:若客户端认为数据发送完成,则它需要向服务端发送连接释放请求。
- 第二次挥手:服务端收到连接释放请求后,会告诉应用层要释放 TCP 链接。然后会发送 ACK 包,并进入 CLOSE_WAIT 状态,此时表明客户端到服务端的连接已经释放,不再接收客户端发的数据了。但是因为 TCP 连接是双向的,所以服务端仍旧可发送数据给客户端。
- 第三次挥手:服务端如果此时还有没发完的数据会继续发送,完毕后会向客户端发送连接释放请求,然后服务端便进入 LAST-ACK 状态。
- 第四次挥手:客户端收到释放请求后,向服务端发送确认应答,此时客户端进入 TIME-WAIT 状态。该状态会持续 2MSL(最大段生存期,指报文段在网络中生存的时间,超时会被抛弃) 时间,若该时间段内没有服务端的重发请求的话,客户端就进入 CLOSED状态。当服务端收到确认应答后,也便进入 CLOSED 状态。
DNS域名解析系统
(1)DNS作用
将域名解析为IP地址,客户端向DNS服务器发送域名查询请求,DNS服务器告知客户端Web服务器的 IP 地址。
(2)各级域名
- 根:.
- 顶级域名:
- 国家顶级域名 cn,us,uk
- 通用顶级域名 com,net,org,gov
- 基础结构域名/反向域名 arpa
- 二级域名:
- 类别域名 ac,com,edu,gov,net,org
- 行政区域名 用于我国各省、自治区、直辖市 bj,js
- 自己注册的域名(全球唯一)
- 三级域名:
- pku.mail
- 四级域名…
(3)域名服务器
- 根域名服务器:(管理该根服务器注册的所有顶级域名):
- 顶级域名服务器(管理该顶级域名服务器注册的所有二级域名):
- 权限域名服务器(负责一个区的域名服务器):
- 本地域名服务器:当一个主机发出DNS查询请求时,这个查询请求报文就发给本地域名服务器。
(4)域名解析过程
- 递归查询(交给别人查询)
- 浏览器首先会在浏览器的缓存中查找对应的IP地址,如果查找到直接返回,若找不到则 浏览器将请求发送给本地域名服务器, 本地域名服务器将请求发送给根域名服务器,根域名服务器将请求发送给顶级域名服务器,顶级域名服务器将请求发送给权限域名服务器,在权限域名服务器缓存中查询, 然后将结果原路返回给请求查询的浏览器。
递归与迭代相结合(有来有回)(第一步是递归查询,递给本地域名服务器去查询) - 浏览器首先会在浏览器的缓存中查找对应的IP地址,如果查找到直接返回,若找不到继续下一步
- 浏览器将请求发送给本地域名服务器,在本地域名服务器缓存中查询,如果查找到,就直接将查找结果返回,若找不到继续下一步
- 本地域名服务器向根域名服务器发送请求,根域名服务器会返回一个所查询域的顶级域名服务器地址
- 本地域名服务器向顶级域名服务器发送请求,顶级服务器查询自己的缓存,如果有记录,就返回查询结果,如果没有就返回下一级权限域名服务器的地址
- 本地域名服务器向权限域名服务器发送请求,权限服务器查询自己的缓存去返回对应的结果给本地域名服务器
- 本地域名服务器将返回结果保存在缓存中,便于下次使用
- 本地域名服务器将返回结果返回给浏览器