八,网络协议 - 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 跨域资源共享
浏览器将请求分为简单请求和复杂请求 满足以下条件就是简单请求
- 请求方法是 GET POST HEAD
- 请求头不超出以下字段 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。
- 预检请求 非简单请求是那种对服务器有特殊要求的请求,比如请求方法是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)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
实现方式
- URL ?sessionId=xxx
- Cookie
HTTPS 问题
通讯问题
1. 客户端https请求服务端
2. 服务端返回公钥 (公钥从数字证书来,客户端会验证证书的完整性
3. 客户端拿到公钥生成(随机 对称算法密码),并用公钥加密密码
4. 发送加密后的对称密码
5. 正式通讯,使用对称算法密码加密数据传输
数字证书
数字证书 解决非对称传输中 中间人 截获的问题。 提供第三方可信任机构 CA 颁发的证书实际就是一个公钥 数字证书 = 网站信息 + 数字签名
TCP 协议
协议报文
- 源端口 包发送者的端口
- 目的端口 接受者的端口
- 序号 重组分段报文的序号,如果设置了SYN标志位则表示请求连接
- 确认序号 如果设置了ACK标志,则表示已接受的数据包
- 数据偏移 指示数据从何处开始
- 保留
- 标志位 URG ACK 确认标记表示已经收到数据 PSH RST SYN 握手的时候有效 FIN 结束标志
- 窗口大小
- 校验和
- 紧急指针
- 自定义选项
- 数据
三次握手流程
- 客户端发送 SYN = 1 seq = j 的包到服务端 (客户端由CLSOSE -> SYN_SENT
- 服务端收到包 将包的 ACK =1,ackseq = j+1, seq = k 发送到客户端 (服务端 由LISTEN -> SYN_RECV
- 客户端收到包 发送 ACK = 1,ackseq = k+1 包到服务端 ( 客户端由 SYN_SENT -> ESTABLISHED 服务端 SYN_RECV -> ESTABLISHED
四次挥手
- 客户端发送 FIN = 1 seq = j 的包到服务端 (通知 客户端关闭 客户端 ESTABLISHED -> FIN_WAIT1
- 服务端接受到包 发送 ACK = 1 ackseq = j+1 的包到客户端 (客户端确认关闭,确认客户端不再发数据 客户端由 FIN_WAIT1->FIN_WAIT2
- 服务端发送完数据后 发送 FIN = 1 ,seq = k 的包到客户端 (通知 服务端关闭 服务端 ESTABLISHED-> LAST_ACK
- 客户端收到包 发送 ACK = 1,ackseq = k+1 包到服务端。 并等待一段时间 (等待的目的是防止服务端未收到ack重发fin,占用端口防止新的连接导致数据丢失 客户端 FIN_WAIT2 -> TIME_WAIT
- 服务端收到包关闭 服务端 服务端 LAST_ACK -> CLOSED
- 客户端超过时间 TIME_WAIT -> CLOSED
UDP 协议
协议头部
- 源端口
- 目标端口
- 长度
- 校验和
ICMP internet 控制报文协议
用处
- MTU探测 利用分片禁止,回传终点不可达差错报文
- 路由改变 发送路由的时候 回传路由改变来调整最优路径
- 源点抑制,路由器处理不过来的时候,发送抑制报文发送端减缓发送速度
- ping tracert
- 扫描端口