Web 前端开发

http协议那些事

2019-02-19  本文已影响0人  tency小七

参考文章:https://yuchengkai.cn/docs/cs/#%E7%8A%B6%E6%80%81%E6%9C%BA

了解TCP/IP协议栈

image.png

左边是ISO/OSI网络体系结构(国际组织的标准规范),右边是TCP/IP协议模型。
ISO/OSI网络体系结构把应用层划分得更加细了。

UDP


面向报文

UDP 是一个面向报文(报文可以理解为一段段的数据)的协议。意思就是 UDP 只是报文的搬运工,不会对报文进行任何拆分和拼接操作。
具体来说,
在发送端,应用层将数据传递给传输层的 UDP 协议,UDP 只会给数据增加一个 UDP 头标识下是 UDP 协议,然后就传递给网络层了
在接收端,网络层将数据传递给传输层,UDP 只去除 IP 报文头就传递给应用层,不会任何拼接操作

不可靠性
  1. UDP是无连接的,也就是说通信不需要建立和断开连接
  2. UDP也是不可靠的,收到什么数据就传递什么数据,也不备份数据,也不关心对方到底有没有收到数据。
  3. UDP没有拥塞控制,只会以恒定的速率去发送,这样实现的弊端就是在网络条件不好的情况下可能会导致丢包,但是优点也很明显,在某些实时性要求高的场景(比如电话会议)就需要使用 UDP 而不是 TCP。
高效

UDP没有TCP那么复杂,所以头部开销很小,只有八字节,相对于TCP的二十字节要小的多,所以在传输报文的时候是很高效的。


image.png

头部包含了下面几个数据。

传输方式

支持一对多,多对一,多对多,一对一,UDP提供了多播,单播,广播的功能。

TCP


头部

TCP头部要比UDP复杂的多。


image.png

对于TCP来说,以下字段是很重要的。

状态机

HTTP 是无连接的,所以作为下层的 TCP 协议也是无连接的,虽然看似 TCP 将两端连接了起来,但是其实只是两端共同维护了一个状态。

TCP 的状态机是很复杂的,并且与建立断开连接时的握手息息相关,接下来就来详细描述下两种握手。

在这之前需要了解一个重要的性能指标 RTT。该指标表示发送端发送数据到接收到对端数据所需的往返时间。

三次握手
image.png
你是否有疑惑明明两次握手就可以建立起连接,为什么还需要第三次应答?
可以想象如下场景。客户端发送了一个连接请求 A,但是因为网络原因造成了超时,这时 TCP 会启动超时重传的机制再次发送一个连接请求 B。此时请求顺利到达服务端,服务端应答完就建立了请求。如果连接请求 A 在两端关闭后终于抵达了服务端,那么这时服务端会认为客户端又需要建立 TCP 连接,从而应答了该请求并进入 ESTABLISHED 状态。此时客户端其实是 CLOSED 状态,那么就会导致服务端一直等待,造成资源的浪费。

PS:在建立连接中,任意一端掉线,TCP 都会重发 SYN 包,一般会重试五次,在建立连接中可能会遇到 SYN FLOOD 攻击。遇到这种情况你可以选择调低重试次数或者干脆在不能处理的情况下拒绝请求。

断开链接四次握手
image.png

为什么 A 要进入 TIME-WAIT 状态,等待 2MSL 时间后才进入 CLOSED 状态?

为了保证 B 能收到 A 的确认应答。若 A 发完确认应答后直接进入 CLOSED 状态,如果确认应答因为网络问题一直没有到达,那么会造成 B 不能正常关闭。

ARQ

RQ 协议也就是超时重传机制。通过确认和超时机制保证了数据的正确送达,ARQ 协议包含停止等待 ARQ 和连续 ARQ。

停止等待ARQ
连续ARQ

在连续 ARQ 中,发送端拥有一个发送窗口,可以在没有收到应答的情况下持续发送窗口内的数据,这样相比停止等待 ARQ 协议来说减少了等待时间,提高了效率。

滑动窗口

在 TCP 中,两端都维护着窗口:分别为发送端窗口和接收端窗口。

发送端窗口包含已发送但未收到应答的数据和可以发送但是未发送的数据。

image.png
Sent and Ackownledged(已经发送已经收到应答)
Sent and Not Yet Acknowledged(已经发送但没收到应答)
Not Sent (还没发送,但是可以发送)
发送端窗口的大小是由接收端窗口的大小决定的,接收方会把当前接收窗口的剩余大小写入应答报文,发送端根据该值和网络拥塞状况来设定发送窗口的大小,所以发送窗口的大小是不断变化的。
当发送端收到应答报文之后,会将窗口进行滑动 image.png

滑动窗口实现了流量控制。接收方通过报文告知发送方还可以发送多少数据,从而保证接收方能够来得及接收数据。

拥塞处理

拥塞处理和流量控制不同,流量控制是作用于接收方,保证接收方来得及接受数据。而拥塞处理是作用于网络,防止过多的数据拥塞网络,避免出现网络负载过大的情况。

拥塞处理包括了四个算法,分别为:慢开始,拥塞避免,快速重传,快速恢复

  1. 连接初始设置拥塞窗口(Congestion Window) 为 1 MSS(一个分段的最大数据量)
  2. 每过一个 RTT 就将窗口大小乘二
  3. 有一个阈值限制,当窗口大小大于阈值时就会启动拥塞避免算法。
  1. 将阈值设为当前拥塞窗口的一半
  2. 将拥塞窗口设为 1 MSS
  3. 启动拥塞避免算法

TCP Taho 实现如下

  1. 将阈值设为当前拥塞窗口的一半
  2. 将拥塞窗口设为 1 MSS
  3. 重新开始慢开始算法
  4. TCP Reno 实现如下

拥塞窗口减半

  1. 将阈值设为当前拥塞窗口
  2. 进入快恢复阶段(重发对端需要的包,一旦收到一个新的 ACK 答复就退出该阶段)
  3. 使用拥塞避免算法

HTTP协议


HTTP协议是无状态协议,不会保存状态

POST和GET的区别

先看看什么是幂等和副作用。
副作用指对服务器上的资源做改变,搜索是无副作用的,注册是副作用的。
幂等指发送 M 和 N 次请求(两者不相同且都大于 1),服务器上资源的状态一致,比如注册 10 个和 11 个帐号是不幂等的,对文章进行更改 10 次和 11 次是幂等的。
在应用场景上来说,GET更适合于幂等和无副作用的的场景,例如搜索关键字。POST多用于不幂等和有副作用的场景,例如注册。
从技术的角度说:

常见状态码

2XX 成功

3XX重定向

4XX客户端错误

5XX服务器错误

浏览器行为与HTTP协议

处理流程:

  1. 输入网址并回车
  2. 解析域名(DNS解析)DNS数据库根据key请求value
  3. 浏览器发送HTTP请求(路由策略)
  4. 服务器处理请求
  5. 服务器返回HTML请求
  6. 浏览器处理HTML页面
  7. 继续请求其他资源
    ps:浏览器会暂时缓存ip地址和网址的关系,不需要再次解析
    请求和响应的路由路径是在运营商处理
    运营商广告: 劫持并解析请求URI,在请求的资源中插入一些脚本,就是弹广告了
HTTP和HTTPS的主要区别
HTTP的工作过程

一次HTTP操作称为一个事务,其操作过程可以分为四步:

  1. 首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作开始。(DNS,TCP)

  2. 建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。(HTTP)

  1. 服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。 (HTTP)

  2. 客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。
    如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了。

HTTP请求和响应
  1. content-encoding:与request的accept encoding相对应,内容是压缩的
  2. content-length:响应体的大小,为了让浏览器正确解析内容
  3. tracecode:追踪码(百度)


    响应.png

    content-type有个坑,前端没有填的话可能会出错,因为后端用的也是框架,他们也不知道有这个东西。

HTTP缓存相关

涉及响应头和请求头中expire,last-modified等参数。
详情请见之前的一篇文章。
https://www.jianshu.com/p/09fa84040ea6

image.png
image.png
请求方法

GET(select): 请求获取Request-URI所标识的资源
POST(create): 在Request-URI所标识的资源后附加新的数据
HEAD: 请求获取由Request-URI所标识的资源的响应消息报头 (相当于ping方法来进行测试,只取得响应头而不需要响应体)
PUT(update): 请求服务器存储一个资源,并用Request-URI作为其标识
DELETE(delete): 请求服务器删除Request-URI所标识的资源
TRACE: 请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务OPTIONS: 请求查询服务器的性能,或者查询与资源相关的选项和需求

GET,POST,PUT,DELETE代表增删查改的四个操作。

Cookies和Session

由于HTTP是无状态的的协议,所以需要Session和Cookies来维持状态。
会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。
在程序中,会话跟踪是很重要的事情。理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。例如,用户A在超市购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话。

而Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。要跟踪该会话,必须引入一种机制。

Cookies是保存在客户端的小段文本,随客户端点每一个请求发送该url
下的所有cookies到服务器端。
客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务 器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

Session则保存在服务器端,通过唯一的值sessionID来区别每一个用户。
SessionID随每个连接请求发送到服务器,服务器根据sessionID来识别客户端,再通过sessionkey获取session值
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。

而服务器就在Session记录相关的信息(客户端的编号等)

Cookies的使用
image.png
  1. Cookie:客户端将服务器设置的Cookie返回到服务器;
  2. Set-Cookie:服务器向客户端设置Cookie;
    服务器在响应消息中用Set-Cookie头将Cookie的内容回送给客户端,客户端在新的请求中将相同的内容携带在Cookie头中发送给服务器。从而实现会话的保持。
Session的使用
image.png
HTTPS协议分析

HTTPS是Hypertext Transfer Protocol over Secure Socket Layer的缩写,即HTTP over SSL,可理解为基于SSL的HTTP协议。HTTPS协议安全是由SSL协议实现的。

http和https的主要区别:

HTTP2协议栈
了解HTTP 3/QUIC

HTTP-over-QUIC被更名为HTTP 3
HTTP 3与HTTP 1.1和HTTP 2没有直接的关系

HTTP与反向代理
正向代理

正向代理 是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。
用途:
(1)访问原来无法访问的资源,如google
(2) 可以做缓存,加速访问资源(服务器缓存要谨慎)
(3)对客户端访问授权,上网进行认证
(4)代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息


正向代理.png
反向代理

反向代理的用途:

image.png

参考博文:https://yuchengkai.cn/docs/cs/#%E7%8A%B6%E6%80%81%E6%9C%BA

Nginx安装及配置

Nginx 配置时使用vi出现了一些问题,i 在光标前插入字符,要修改内容就要先输入i才能进行下一步操作。修改完成之后点击esc然后:wq就可以保存并退出了。

检查配置文件nginx.conf的正确性命令:
也成功了。

image.png
注意路径,注意安装版本。
image.png
遇到了一个困扰很久的问题:
Nginx [emerg]: bind() to 0.0.0.0:80 failed (98: Address already in use)
image.png
image.png
使用netstat -ltunp去看端口的使用情况。
发现是tcp在占用这个端口,直接使用命令关闭。
sudo fuser -k 80/tcp
nginx.conf配置

将每一项的配置都进行注释,便于理解。




怎么配反向代理

在sever前面加上


image.png

上图的意思就是反向代理到本机上面的8080端口。如果多加几个ip就能做负载均衡。
接下来进行设置:
location+反向代理的路径(这是用户输入的路径)
proxy_pass:后面一定要跟协议头(http://)proxy_pass后面的路径是真正要去的服务器。
注意:配置的时候一定要原封不动的将下面的这些都复制一波。
更加详细的可以看资料中文件。


image.png

然后就ok了,完结撒花。

上一篇 下一篇

猜你喜欢

热点阅读