从TCP到HTTP

126 阅读5分钟

1. TCP

  • 阮一峰
  • 掘金
  • Transmission Control Protocol
  • 传输层协议
  • SEQ:Sequence
  • 可靠:通过SEQACK实现,ACK为期望收到的下一个报文的SEQ,连续三次收到同一个ACK后服务端会重传报文;或者报文超时没有收到ACK也会重传
  • 慢启动:受硬件影响,发得快可能丢包越多,所以需要从低速慢慢加速,根据收到的ACK和窗口大小确定速度

三次握手

  • 客户端发送SYN=1,seq = x
  • 服务端接收到发送SYN = 1ACK = x+1seq = y
  • 客户端发送ACK = y+1

四次挥手

(1)过程

  • 假设主机A发送FIN报文,意为主机A数据发送完了
  • 主机B接收到后,发送ACK主机A收到后进入FIN-WAIT-1状态
  • 主机B发送完剩下的数据后,发送FIN
  • 主机A收到后,发送ACK,进入TIME_WAIT状态,等待2MSL后正式进入CLOSED状态,服务端收到ACK后立刻进入CLOSED状态

(2)为什么需要四次

  • 主机B可能仍有未发送完的数据,发送完了才能发FIN

(3)为什么需要等待2MSL

  • MSLMaximun Segment Lifetime,报文的最大生存时间,即超时重传的时限
  • 主机B没收到ACK会再次发送FIN,所以等待2MSL可以确保主机B已收到ACK
  • 防止本次连接干扰其他连接,2MSL后本次连接的所有报文都会失效

2. DNS

  • 掘金

  • Domain Name System

  • 域名->ipip->域名

  • 查询过程是递归+迭代的过程

  • TLDTop Level Domain

查询过程:

  1. 本地DNS服务器发送请求
  2. 本地DNS服务器根DNS服务器发送请求
  3. 根DNS服务器返回TLD服务器列表
  4. 本地DNS服务器随机挑选一台TLD服务器发送请求
  5. TLD服务器返回权威DNS服务器列表
  6. 本地DNS服务器向其中一台权威DNS服务器发送请求
  7. 获得ip地址,返回给请求的主机

3. HTTP

  • 掘金
  • 阮一峰
  • Hyper Text Transform Protocol
  • 超文本,其中最常用的是HTML

跨域

  • 同源策略:浏览器会拦截非同源的请求
  • 同源:协议scheme、主机host、端口port都相同

(1)CORS:跨域资源共享

  • 浏览器会自动在请求头当中,添加一个Origin字段。服务器拿到请求之后,在回应时对应地添加Access-Control-Allow-Origin字段,如果Origin不在这个字段的范围中,那么浏览器就会将响应拦截。
  • Access-Control-Allow-Origin值为*则不会拦截

(2)JSONP

  • 原理:script标签可以通过src上的地址发出get请求,不受同源策略影响,并能通过回调拿到数据
  • script标签只能执行get请求,但兼容性好
<script src='http://aaa.bbb.com/something?callback=callbackFun' />
<script>
    const callbackFun = data => {
        // 处理数据
    }
</script>

(3)Nginx反向代理

  • 原理:将前端和后端服务器都代理到Nginx服务器上,所以它们就不跨域了

(4)其他方法

  • postMessage
  • WebSocket

POST 和 GET 的区别

  • GET只支持ASCII字符,POST没有限制
  • GET全部参数都在URL上,不安全
  • 实现时除了火狐浏览器,其他浏览器的POST请求会分成两个TCP包,先发Header,收到100CONTINUE)后继续发送Body
  • GET请求会被浏览器主动缓存,并留下历史记录,POST不会
  • GET是幂等的,POST不是

缺点

  • 无状态,可能会传输大量重复的HTTP头部
  • 明文传输,使用文本形式的数据,不安全
  • 队头阻塞HTTP/1.1允许TCP复用,但通信会依次进行,服务器只有处理完一个回应,才会进行下一个回应,如果前面的回应特别慢,则后面就会有许多的请求排队

优点

  • 无状态,不用维持状态,减轻服务器压力
  • 可靠传输
  • 灵活可扩展,只规定了基本框架,语义自由,并且可以传输多种格式数据
  • 请求-应答

4. HTTP/1.1

  • 持久连接TCP连接默认不关闭
  • 管道,同一个TCP连接可发送多个请求
  • Content-Length,声明本次回应的长度,后面的字节即为下一个回应
  • 分块传输编码Transfer-Encoding: chunked允许分块传输数据,数量未定,每个数据块第一行为该块的长度,最后一个为0,表示本次数据传输完毕

5. HTTP/2

  • 二进制协议
  • 多工,可以同时发送多个请求或回应,避免队头阻塞
  • 数据流。数据包不按顺序发送,需要标记来自哪个请求或回应。每个请求或回应里所有的数据包成为一个数据流。数据流发送到一半时,客户端和服务端都可以取消该数据流
  • 头信息压缩,使用gzipcompress压缩,并且相同的信息不再发送,而是改为维护一张头信息表
  • 服务器推送

常用状态码

状态码含义其他
200成功
204处理成功,但无资源返回
301永久重定向
302临时性重定向
304服务器端资源未改变,可直接使用缓存
400请求报文语法错误服务器无法处理
401未认证用于浏览器自己的认证
404资源未找到
500服务器内部错误
503服务不可用服务器忙不过来了或在停机维护

HTTP方法

方法作用其他
GET获取资源
POST传输实体主体
PUT传输文件
HEAD获得报文首部确认URI的有效性及资源的更新日期
DELETE删除文件
OPTIONS询问支持的方法
TRACE追踪路径
CONNECT要求用隧道协议连接代理主要用于SSL和TLS