八,网络协议 - 348052148/learnGraph GitHub Wiki

一,http,https 二,tcp ip udp

HTTP 协议

HTTP常用请求头

断点续传的实现原理

HTTP协议的GET方法,支持只请求某个资源的某一部分; 206 Partial Content 部分内容响应; Range 请求的资源范围; Content-Range 响应的资源范围; 在连接断开重连时,客户端只请求该资源未下载的部分,而不是重新请求整个资源,来实现断点续传。 分块请求资源实例: Eg1:Range: bytes=306302- :请求这个资源从306302个字节到末尾的部分; Eg2:Content-Range: bytes 306302-604047/604048:响应中指示携带的是该资源的第306302-604047的字节,该资源共604048个字节; 客户端通过并发的请求相同资源的不同片段,来实现对某个资源的并发分块下载。从而达到快速下载的目的。目前流行的FlashGet和迅雷基本都是这个原理。

多线程下载的原理

下载工具开启多个发出HTTP请求的线程; 每个http请求只请求资源文件的一部分:Content-Range: bytes 20000-40000/47000; 合并每个线程下载的文件。

Http 跨域问题

  • 利用script 标签请求后端返回的数据,直接进行执行 (缺点只能GET
  • 利用iframe + from 进行 可以post请求
  • CORS 跨域资源共享
浏览器将请求分为简单请求和复杂请求 满足以下条件就是简单请求
  1. 请求方法是 GET POST HEAD
  2. 请求头不超出以下字段 Accept Accept-Language Content-Language Last-Event-ID Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
1)Access-Control-Allow-Origin

该字段是必须的。它的值要么是请求时Origin字段的值,要么是一个*,表示接受任意域名的请求。

(2)Access-Control-Allow-Credentials

该字段可选。它的值是一个布尔值,表示是否允许发送Cookie。默认情况下,Cookie不包括在CORS请求之中。设为true,即表示服务器明确许可,Cookie可以包含在请求中,一起发给服务器。这个值也只能设为true,如果服务器不要浏览器发送Cookie,删除该字段即可。

(3)Access-Control-Expose-Headers

该字段可选。CORS请求时,XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿到其他字段,就必须在Access-Control-Expose-Headers里面指定。上面的例子指定,getResponseHeader('FooBar')可以返回FooBar字段的值。

 (4)Access-Control-Allow-Credentials: true
如果要发送Cookie,Access-Control-Allow-Origin就不能设为星号,必须指定明确的、与请求网页一致的域名。同时,Cookie依然遵循同源政策,只有用服务器域名设置的Cookie才会上传,其他域名的Cookie并不会上传,且(跨源)原网页代码中的document.cookie也无法读取服务器域名下的Cookie。
非简单请求

非简单请求是那种对服务器有特殊要求的请求,比如请求方法是PUT或DELETE,或者Content-Type字段的类型是application/json。

  1. 预检请求 非简单请求是那种对服务器有特殊要求的请求,比如请求方法是PUT或DELETE,或者Content-Type字段的类型是application/json。 预检"请求用的请求方法是OPTIONS,表示这个请求是用来询问的。头信息里面,关键字段是Origin,表示请求来自哪个源。

除了Origin字段,"预检"请求的头信息包括两个特殊字段。

(1)Access-Control-Request-Method

该字段是必须的,用来列出浏览器的CORS请求会用到哪些HTTP方法,上例是PUT。

(2)Access-Control-Request-Headers

该字段是一个逗号分隔的字符串,指定浏览器CORS请求会额外发送的头信息字段,上例是X-Custom-Header。

  1. 预检请求的回应 (1)Access-Control-Allow-Methods

该字段必需,它的值是逗号分隔的一个字符串,表明服务器支持的所有跨域请求的方法。注意,返回的是所有支持的方法,而不单是浏览器请求的那个方法。这是为了避免多次"预检"请求。

(2)Access-Control-Allow-Headers

如果浏览器请求包括Access-Control-Request-Headers字段,则Access-Control-Allow-Headers字段是必需的。它也是一个逗号分隔的字符串,表明服务器支持的所有头信息字段,不限于浏览器在"预检"中请求的字段。

(3)Access-Control-Allow-Credentials

该字段与简单请求时的含义相同。

(4)Access-Control-Max-Age

该字段可选,用来指定本次预检请求的有效期,单位为秒。上面结果中,有效期是20天(1728000秒),即允许缓存该条回应1728000秒(即20天),在此期间,不用发出另一条预检请求。

CORS与JSONP的使用目的相同,但是比JSONP更强大。

JSONP只支持GET请求,CORS支持所有类型的HTTP请求。JSONP的优势在于支持老式浏览器,以及可以向不支持CORS的网站请求数据。

// 如果需要http请求中带上cookie,需要前后端都设置credentials,且后端设置指定的origin
'Access-Control-Allow-Origin', 'http://localhost:9099'
'Access-Control-Allow-Credentials', true
// 非简单请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求(preflight)
// 这种情况下除了设置origin,还需要设置Access-Control-Request-Method以及Access-Control-Request-Headers
'Access-Control-Request-Method', 'PUT,POST,GET,DELETE,OPTIONS'
'Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, t'
  • nginx代理 (不解释了

COOKIE 和 SESSION

http是无状态的,COOKIE和SESSION就是解决http无状态的问题。

COOKIE

request Cookie 请求头里

response set-Cookie

主要包括:名字,值,过期时间,路径和域。 路径与域合在一起就构成了cookie的作用范围

SESSION

实现方式

  1. URL ?sessionId=xxx
  2. Cookie

HTTPS 问题

通讯问题

1. 客户端https请求服务端
2. 服务端返回公钥 (公钥从数字证书来,客户端会验证证书的完整性
3. 客户端拿到公钥生成(随机 对称算法密码),并用公钥加密密码
4. 发送加密后的对称密码
5. 正式通讯,使用对称算法密码加密数据传输

数字证书

数字证书 解决非对称传输中 中间人 截获的问题。 提供第三方可信任机构 CA 颁发的证书实际就是一个公钥 数字证书 = 网站信息 + 数字签名

TCP 协议

协议报文

  1. 源端口 包发送者的端口
  2. 目的端口 接受者的端口
  3. 序号 重组分段报文的序号,如果设置了SYN标志位则表示请求连接
  4. 确认序号 如果设置了ACK标志,则表示已接受的数据包
  5. 数据偏移 指示数据从何处开始
  6. 保留
  7. 标志位 URG ACK 确认标记表示已经收到数据 PSH RST SYN 握手的时候有效 FIN 结束标志
  8. 窗口大小
  9. 校验和
  10. 紧急指针
  11. 自定义选项
  12. 数据

三次握手流程

  1. 客户端发送 SYN = 1 seq = j 的包到服务端 (客户端由CLSOSE -> SYN_SENT
  2. 服务端收到包 将包的 ACK =1,ackseq = j+1, seq = k 发送到客户端 (服务端 由LISTEN -> SYN_RECV
  3. 客户端收到包 发送 ACK = 1,ackseq = k+1 包到服务端 ( 客户端由 SYN_SENT -> ESTABLISHED 服务端 SYN_RECV -> ESTABLISHED

四次挥手

  1. 客户端发送 FIN = 1 seq = j 的包到服务端 (通知 客户端关闭 客户端 ESTABLISHED -> FIN_WAIT1
  2. 服务端接受到包 发送 ACK = 1 ackseq = j+1 的包到客户端 (客户端确认关闭,确认客户端不再发数据 客户端由 FIN_WAIT1->FIN_WAIT2
  3. 服务端发送完数据后 发送 FIN = 1 ,seq = k 的包到客户端 (通知 服务端关闭 服务端 ESTABLISHED-> LAST_ACK
  4. 客户端收到包 发送 ACK = 1,ackseq = k+1 包到服务端。 并等待一段时间 (等待的目的是防止服务端未收到ack重发fin,占用端口防止新的连接导致数据丢失 客户端 FIN_WAIT2 -> TIME_WAIT
  5. 服务端收到包关闭 服务端 服务端 LAST_ACK -> CLOSED
  6. 客户端超过时间 TIME_WAIT -> CLOSED

UDP 协议

协议头部

  1. 源端口
  2. 目标端口
  3. 长度
  4. 校验和

ICMP internet 控制报文协议

用处

  1. MTU探测 利用分片禁止,回传终点不可达差错报文
  2. 路由改变 发送路由的时候 回传路由改变来调整最优路径
  3. 源点抑制,路由器处理不过来的时候,发送抑制报文发送端减缓发送速度
  4. ping tracert
  5. 扫描端口