Skip to content

HTTP的建立

1. OSI七层模型与TCP/IP四层模型

OSI 七层模型OSI 五层模型TCP/IP四层模型
应用层应用层应用层
表示层--
会话层--
传输层传输层传输层
网络层网络层网络层
链路层链路层网络接口层
物理层物理层-

img

2. TCP握手协议(传输层、端对端)

2.1 建立链接

  1. 第一次握手

​ 客户端主动打开链接,服务端被动打开。客户端发送SYN段(包含了客户端的初始序列号seq=i)

如果半连接队列未满,服务器将该链接的状态变为SYN_RCVD,并把链接信息放入半连接队列中。

否则,服务器不会将链接状态改为SYN_RCVD,并且丢弃该链接。

(SYN flood攻击,DDOS攻击的一种,就是借助这种方式,不断发送SYN段但是不处理SYN+ACK段,使服务器崩溃。应对方式之一是让syncookies=1,即使半连接队列已满也可以接受非恶意攻击的客户端请求。)

(SYN flood攻击的方式其实也分两种,第一种,攻击方的客户端一直发送SYN,对于服务器回应的SYN+ACK什么也不做,不回应ACK, 第二种,攻击方的客户端发送SYN时,将源IP改为一个虚假的IP, 然后服务器将SYN+ACK发送到虚假的IP, 这样当然永远也得不到ACK的回应。)

  1. 第二次握手

    服务端返回SYN+ACK段,且段中包含服务器的初始序列号seq=j,同时ACK=i+1,表示确认收到客户端的seq

    此时,客户端从SYN_SENT变为ESTABLISHED

  2. 第三次握手

    客户端返回ACK段,ACK=j+1,表示收到了服务器的初始序列号。

    服务器收到ACK后,如果全连接队列未满,服务器将该链接从SYN_RCVD变为ESTABLISHED,然后将该链接移出半连接队列,移入全连接队列。

    若已满,会根据tcp_abort_on_overflow的值进行执行相应步骤。

    1. 值为0

      给客户端定时(二进制指数退让)发送SYN+ACK重新进行第二次握手。

    2. 值为1

      重置连接(发送RST给客户端/忽略客户端传来的包,直到客户端认为异常断开)

2.2 断开链接

  1. 第一次

    主动关闭方发送FINseq=u,此时FIN只是意味着客户端不再发送数据,并不意味着他不再接收数据,客户端进入FIN_WAIT1状态。

  2. 第二次

    服务器给客户端发送FINACK= u+1,seq=v,表示收到了客户端的FIN,此时服务器进入CLOSE_WAIT状态,客户端收到ACK后,进入FIN_WAIT2状态。

  3. 第三次

    服务器确认发送完所有数据后,发送FINseq=wACK= u+1给客户端,之后进入LAST_ACK状态。

  4. 第四次

    客户端收到服务器的FIN后,发送ACK= w+1, seq= u+1

3. 状态码

  1. 1xx 信息性,代表请求已被接受,需要继续处理。
  2. 2xx 成功
    • 200 请求已成功
    • 201 表示资源已被新建
    • 204 成功但是不返回内容
  3. 3xx 重定向
    • 301 资源永久转移
    • 302 临时转移
    • 304 缓存未过期,可以直接使用
  4. 4xx 客户端错误
    • 400 语法错误,服务器无法理解
    • 401 身份认证错误
    • 403 无权限访问
    • 404 资源找不到
    • 409 资源冲突
  5. 5xx 服务端错误
    • 500 未知错误(服务器源代码、数据库错误)
    • 502 网关错误
    • 503 服务器超载或维护
    • 504 网关请求超时

4. 版本差异

5. HTTP缓存

Released under the MIT License.