HTTP相关知识汇总

基础定义

TCP/IP体系结构(4层)

应用层 (应用层,表示层,会话层)

协议:
HTTP - 提供Internet浏览服务
SMTP - 简单的电子邮件发送服务
DNS - 负责域名和IP地址的映射
POP / IMAP - 对邮箱服务器进行远程存取邮件的服务(POP-服务端传给客户端后删除、状态不一样步;IMAP-服务端存、状态同步)
FTP - 应用级文件传输服务
Telnet - 远程登陆服务(明文传输)
SSH - 远程登陆服务(加密)
定义应用进程间通讯、交互的规则。(主机中运行的程序、基于CS方式、报文)

运输层

协议:
TCP - 面向链接、可靠的报文服务
UDP - 无链接、不可靠的报文服务
为不一样主机中的进程间提供通讯服务。传输单位:报文段(TCP)、用户数据报文(UDP)
功能:
为端到端的链接提供传输服务。

网络层

协议:
IP - 提供网络节点之间的报文传送服务
ARP - 实现IP地址向物理地址的映射【ARP攻击】
RARP - 实现物理地址向IP地址的映射
ICMP - 探测、报告传输中产生的错误
IGMP - 管理多播组测成员关系
其他:IPX、OSPF
为不一样主机提供通讯服务:网络层的分组数据从源端到目的端。传输单位:数据报。
功能:
  1. 封装数据成分组/包、路由选择
  2. 流量控制、拥塞控制、差错控制、网际互联

网络接口层(链路层、物理层)

协议:STP
负责数据传输工做。传输单位:帧
功能:
  1. 组帧、差错控制、流量控制和传输管理
  2. 在广播式网络经过介质访问子层,控制共享信道的访问

TCP与UDP

TCP协议 (Transmission Control Protocol,传输控制协议)

面向链接、面向字节流、全双工通讯、可靠。
属于传输层通讯协议,基于TCP的应用层协议有 HTTP SMTP FTP Telnet POP3。
缺点:效率慢(创建链接、发送确认包)php

传送的数据单元:报文段。css

报文段 = 首部 + 数据
首部 = 20字节 + 4n个根据须要增长的选项 (最小长度 20 字节)
//共 5 行,每行4字节
源端口  目的端口
序号
确认号
数据偏移  保留  URG ACK PSH RST SYN FIN  窗口
校验和  紧急指针

序号 - 报文段序号
确认号 - (ACK)指望收到对方下一个报文的序号。ACK=N,表示序号N-1的全部数据都已正确收到
SYN - 同步位,链接创建时用于同步序号
FIN - 终止控制位,释放链接

TCP创建链接 - 三次握手

C -> S - SYN=1,seq=x
C <- S - SYN=1,ACK=1,seq=y,ack=x+1
C -> S - ACK=1,seq=x+1,ack=y+1

做用:防止接受早已失效的链接请求报文,形成死锁、浪费资源html

TCP释放链接 - 四次挥手

C -> S - FIN=1,seq=u
C <- S - ACK=1,seq=v,ack=u+1
     CLOSE_WAIT //通知上层关闭
C <- S - FIN=1,ACK=1,seq=w,ack=u+1
C -> S - ACK=1,seq=u+1,ack=w+1
TIME_WAIT (2MSL)

无差错控制原理

基础:web

发送窗口

任意时刻,发送方维持的一组连续的、容许发送帧的帧序号(对发送方的进行流量控制)
工做原理:1. 每收到一个确认帧,发送窗口向前滑动一个帧的距离;2. 无可发送帧时,中止发送,等待确认帧。有确认帧且窗口向前滑动时,才继续发送。编程

接受窗口

任意时刻,接收方维持的一组连续的、容许接受帧的帧序号(控制可接受、不可接受哪些数据帧,只有收到的帧序号在窗口内才容许收下)
工做原理:收到数据帧后,窗口向前移动一个位置,并发回确认帧。若收到窗口以外的,一概丢弃。json

协议

中止-等待协议、后退N帧协议、选择重传协议只是在发送窗口大小和接收窗口大小上有所差异跨域

中止-等待协议:发送窗口大小 = 1,接收窗口大小 = 1
后退N帧协议:发送窗口大小 > 1, 接收窗口 = 1
选择重传协议:发送窗口大小 > 1,接收窗口 > 1

实现无差错传输的解决方案

采用可靠传输协议,使得 1.出错重传,出现差错时,让发送方重传差错数据;2.速度匹配,当接收方来不及接收可通知发送方下降速率。浏览器

自动重传请求协议ARQ(Auto Repeat reQuest) (针对 出错重传)
传输出现差错时,接收方自动请求发送方重传出错的数据。
机制:1.确认机制 - 发送方收到应答才发送,接收方收到一个反馈一个,不反馈发送方一直等待;2.超时重传机制 - 发送方发送后开启计时器,必定时间内每收到确认,则重发,直到成功为止。
类型:中止等待式ARQ、后退N帧ARQ、选择重传ARQ。缓存

流量控制 & 拥塞控制 (针对 速度匹配)
接收方根据本身接收缓存的大小,动态调整发送方的发送窗口大小。
避免发送太快,接收方来不及。安全

相关资料:
TCP协议攻略

UDP协议 (User Dataram Protocal, 用户数据报协议)

属于传输层通讯协议
基于UDP的应用层协议有 TFTP(文件传输)、SNMP(网络管理)、NFS(远程文件服务器) 与 DNS(域名转换)

无链接的、不可靠的、面向报文、无拥塞协议

不须要创建链接,发送后不论是否会到达
以数据报文(包)的形式传输,UDP数据报文长度无限制,一次性发送,不拆分

报文段格式

UDP的报文段共有2个字段:数据字段 + 首部字段(8字节,4个字段)

UDP首部:
源端口 - 源端口号,须要 对方回信时使用
目的端口 - 终点交付报文时需使用到
长度 - UDP用户数据报的长度
检验和 - 检测在传输中是否有错,有错丢弃

HTTP (HyperText Transfer Protocol, 超文本传输协议)

属于应用层。规定了应用进程间通讯的准则。

特色:
传输效率高 - 无链接、无状态、传输格式简单
传输可靠性高 - 采用TCP做为传输层协议

请求方法

不一样的方法规定了不一样的操做指定的资源的方式。服务端会根据不一样的请求方法作不一样的响应。

若服务器时 RESTful 接口,通常会用到 GET、POST、DELETE、PUT
  • GET

显示请求指定资源。只用于数据的读取。

传递参数长度受限制,只容许ASCII字符,安全性差(可见)
应用场景:小量、数据不敏感,从指定资源请求数据

  • POST

向指定资源提交数据,请求数据处理。表单数据提交、文件上传。

传递参数长度不受限制,可传递任何类型字符,安全性好
应用场景:大量、数据敏感,想指定资源提交数据

  • HEAD

向服务器发出指定资源的请求,服务器在响应是不会回传响应主体(内容)。

能够在不传输所有内容的状况下,获取服务器的响应头信息。经常使用于客户端查看服务端性能。【请求完整执行?】

  • PUT (如下 1.1新增)

向指定资源位置上传其最新内容,取代指定的资源(已存在)的内容。

  • PATCH

当资源不存在时会建立新资源。部分更新。

  • DELETE

请求服务器删除所请求的URI所标识的资源。

  • OPTIONS

请求服务器返回该资源所支持的全部HTTP请求方法。

JS的XMLHttpRequest对象进行 CORS(Cross-origin resource sharing, 跨域资源共享) 时,使用OPTIONS方法发送嗅探请求,以判断是否有对指定资源的访问权限。

例如:

请求:
OPTIONS /upload HTTP/1.1
Access-Control-Request-Method: POST //提醒接下来的请求会使用的方法
Access-Control-Request-Headers: accept, content-type
Origin: http://xxx.com
...

响应头中的关键字:
Access-Control-Allow-Method: POST
Access-Control-Allow-Origin: http://xxx.com //容许的域名
可设置相应状态码为 204 ,告知客户端该响应成功了,可是没有任何响应体。
  • CONNECT

预留,能将链接方式改成管道方式的代理服务器。一般用于SSL加密服务器的连接与非加密的HTTP代理服务器的通讯。

  • TRACE

请求服务器回显其收到的请求信息,用于HTTP请求的测试或诊断。

HTTP报文详解

HTTP在应用层交互数据的方式:报文
HTTP的报文分为:请求报文、响应报文

请求报文:

HTTP的请求报文由 请求行、请求头、请求体 组成。

请求方法 URL 协议版本
头部字段名:值
头部字段名:值

请求数据

(换行都rn)
请求行(request line) - 声明 请求方法、主机域名、资源路径、协议版本
请求头(header) - 声明 客户端、服务器报文的部分信息
请求体 - 存放须要发送的数据信息

例如:

GET /index.php/archives/3/ HTTP/1.1
Host: liyunzhen.com   (HTTP/1.0 无host字段)
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

请求Header

请求和响应报文的通用header:

Content-Type - 请求体/响应体的类型,如 text/plain,application/json
Accept - 说明接收的类型,能够多个值,用逗号分开
Content-Length - 请求体/响应体的长度,单位字节
Content-Encoding - 请求体/响应体的编码格式,如gzip、deflate
Accept-Encoding - 告知对方我方接受的Content-Encoding
ETag - 给当前资源的标识,和 Last-Modified、If-None-Match、If-Modified-Since 配合,用于缓存控制
Cache-Control - 取值通常为 no-cache 或 max-age=xx(整数,该资源的缓存有效期,秒)

请求Header:

Authorization - 用于设置身份认证信息
User-Agent - 用户标识,如 OS和浏览器的类型、版本
If-Modified-Since - 值为上一次服务器返回的 Last-Modified 值,用于确认某个资源是否被更改过,没有更改过(304)就从缓存中读取
If-None-Match - 值为上一次服务器返回的 ETag 值,通常和 If-Modified-Since 一块儿出现
Cookie - 已有的Cookie
Referer - 表示请求引用自那个地址(来源地址)
Host - 请求的主机和端口号

请求体 - 存放须要发送给服务器的数据信息。(可选)

使用方式:

1. 数据交换
 请求体可任意格式类型,须要服务端额外解析。如json格式【protocol buffer 看看是否是】
2. 键值对
 键=值&键=值。如key1=1&key2=2
3. 分部形式
 请求体被分为多个部分,每段以 -{boundary} 、描述头、(空行)、内容,以 -{boundary}- 结束

响应报文

HTTP的响应报文包括:状态行、响应头、响应体

报文结构:

协议版本 状态码 状态描述
头部字段名:值
头部字段名:值

响应正文

状体行 - 声明 协议版本、状态码、状态码描述
响应头 - 声明 客户端、服务端报文的部分信息
响应体 - 存放须要发送的数据信息

例如:

HTTP/1.1 200 OK
Server: openresty
Date: Sun, 12 Aug 2018 02:35:31 GMT
Content-Type: text/html; charset=UTF-8

HTTP状态码

3位十进制数字组成,分为5大类:

1xx - 表示信息通知,如收到了请求正在处理
2xx - 表示成功,如接受或知道了
3xx - 表示重定向,如要完成请求还必须采起进一步行动
4xx - 表示客户端错误,请求包含语法错误或没法实现
5xx - 表示服务器错误

举例:

200 - 请求成功,请求内容与该响应一块儿返回
202 - 请求已被接受,但还没处理
204 - 请求执行成功,可是没有数据(浏览器不用刷新页面,也不用导向新的页面)
301 - 请求资源已被永久移动到新的位置
302 - 请求的资源被临时移动到新的位置
304 - 服务端资源未发生改变(If Modified Since和资源更新的时间),只返回HEADER
400 - 请求参数有误,当前请求没法被服务器理解
401 - 请求须要验证用户
403 - 不容许访问该地址
404 - Not Found
408 - 请求超时
500 - 服务器内部错误
502 - Bad Gateway 网关出错

协议版本(HTTP/1.0、HTTP/1.一、HTTP/2.0)

HTTP/1.1 特色:
引入持久链接,(在同一个TCP的链接中可传送多个HTTP请求、响应)
多个请求、响应可同时进行、可重叠
引入更多请求头、响应头(身份认证、状态管理、cache缓存、host)

HTTP处理长链接方式:
HTTP/1.1 默认保持长链接,数据传输完成后TCP链接不断开,继续使用该通道传输数据。

创建长链接:

HTTP头部字段:Connection
connection:close - 不使用长链接
connection:Keep-Alive & Keep-Alive:max=20 - 链接失败超过这个次数就断开
connection:Keep-Alive & Keep-Alive:time=20 - 超过该时间则断开

Keep-Alive机制:开启后,TCP层定时发送响应的探针以肯定链接的可用性

结束长链接(如何判断本次传输结束)

  1. 判断传输数据是否达到了 Content-Length 指示的大小
  2. 根据 chunked 编码判断,若 chunked 编码的数据在最后有一个空 chunked 块,则代表本次传输完毕

HTTP/2.0特色
支持请求与响应的多路复用,经过压缩HTTP头字段下降开销,增长请求优先级和服务端推送的支持。

多路复用: 容许同时经过单一的HTTP/2.0链接发起多重的请求、响应消息
将HTTP协议通讯的基本单位缩小为帧。在应用层和传输层之间增长了一个二进制分帧层。
在二进制分帧层中,HTTP/2.0会将全部传输的消息分割为更小的消息和帧(frame),并采用二进制格式的编码。
服务器推送:当对webServer请求数据时,服务器会顺便把一些客户端须要的资源一块儿推到客户端,省得客户端再次建立链接请求。适合加载静态资源。

升级配置:

Nginx从1.9版本开始支持HTTP/2.0,编译模块http_v2_module。http2.0协议须要使用https协议

HTTPS

HTTP: 应用层,不加密,80
HTTPS: 传输层,加密,443

这是一份全面& 详细 HTTP知识讲解

HTTP相关协议(一次完整的浏览器请求流程)

在浏览器输入URL回车后,流程:

  1. 域名解析

DNS解析 - 从域名解析到IP地址
搜索浏览器自身的DNS缓存 -- 系统缓存 -- 浏览器向本地配置的首选DNS服务器发起域名解析请求(经过UDP协议向DNS的53端口发起请求,DNS会递归请求,直到拿到IP)

  1. 发起TCP三次握手

拿到域名对应的IP后,浏览器以一个随机端口(1024 < < 65535)向服务器的web程序80端口发起TCP链接请求。

  1. TCP链接后发起http请求
  2. 服务器响应http请求,浏览器获得html代码
  3. 浏览器解析html代码,并请求html代码中的资源(js、css、图片等)
  4. 浏览器对页面进行渲染呈现给用户

加入CDN后的访问过程:

  1. 用户点击URL被cname到CDN服务器的IP(全局负载均衡设备IP)(DNS解析);
  2. 用户向该IP发起内容URL访问请求;
  3. 该全局负载均衡设备根据用户IP请求内容,选择一台用户所属区域负载均衡设备。区域负载均衡设备根据 IP地址(判断服务器距用户最近)、内容、负载等,返回一台缓存服务器的IP地址。
  4. 用户用返回的IP向缓存服务器发起请求。若是该缓存服务器上没有会向上级请求,一直追溯到源服务器。

Cookie与Session

IP地址(IPV4IPV6)

Socket 套接字

一个编程调用接口(API),属于传输层。
一个socket实例惟一表明一个主机上的一个应用程序的通讯链路。
成对出现:

Socket = {(IP地址1:PORT端口号),(IP地址2:PORT端口号)}

创建Socket链接过程:
客户端:

1. 建立一个 Socket 实例
2. 操做系统将为该 Socket 实例分配一个未被使用的本地端口号
3. 操做系统建立一个含 本地、远程地址、端口号 的套接字数据结构。(系统一直保留该数据结构到链接关闭)
4. 在建立 Socket 实例的构造函数正确返回前,进行 TCP 的三次握手协议
5. TCP 握手协议完成后,Socket 实例对象将建立完成。(不然抛出 IOException 错误)

服务器:

1. 建立一个 ServerSocket 实例
2. 操做系统为 ServerSocket 实例建立一个底层数据结构。(包含指定监听的端口号、监听地址的通配符[一般是 * ,表示监听全部地址])
3. 调用 accept() 方法时,将进入阻塞状态,等待客户端请求
4. 当一个新的请求到来时,将为该链接建立一个新的套接字数据结构。(包含 请求原地址和端口,关联到 ServerSocket 实例的一个未完成的链接数据结构列表中)
5. 三次握手完成后,该服务端Socket实例才会返回,而且将该 Socket 实例对应的数据结构从未完成列表中移到已完成列表中

相关资料:
Socket使用攻略

Ping与ICMP

time_wait与close_wait

调试工具/方法

相关资源

计算机网络基础

相关文章
相关标签/搜索