HTTP的建立
1. OSI七层模型与TCP/IP四层模型
OSI 七层模型 | OSI 五层模型 | TCP/IP四层模型 |
---|---|---|
应用层 | 应用层 | 应用层 |
表示层 | - | - |
会话层 | - | - |
传输层 | 传输层 | 传输层 |
网络层 | 网络层 | 网络层 |
链路层 | 链路层 | 网络接口层 |
物理层 | 物理层 | - |
2. TCP握手协议(传输层、端对端)
2.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的回应。)
第二次握手
服务端返回
SYN
+ACK
段,且段中包含服务器的初始序列号seq=j
,同时ACK=i+1
,表示确认收到客户端的seq
。此时,客户端从
SYN_SENT
变为ESTABLISHED
第三次握手
客户端返回
ACK
段,ACK=j+1
,表示收到了服务器的初始序列号。服务器收到ACK后,如果全连接队列未满,服务器将该链接从
SYN_RCVD
变为ESTABLISHED
,然后将该链接移出半连接队列,移入全连接队列。若已满,会根据
tcp_abort_on_overflow
的值进行执行相应步骤。值为0
给客户端定时(二进制指数退让)发送SYN+ACK重新进行第二次握手。
值为1
重置连接(发送RST给客户端/忽略客户端传来的包,直到客户端认为异常断开)
2.2 断开链接
第一次
主动关闭方发送
FIN
与seq=u
,此时FIN
只是意味着客户端不再发送数据,并不意味着他不再接收数据,客户端进入FIN_WAIT1
状态。第二次
服务器给客户端发送
FIN
与ACK= u+1
,seq=v
,表示收到了客户端的FIN
,此时服务器进入CLOSE_WAIT
状态,客户端收到ACK
后,进入FIN_WAIT2
状态。第三次
服务器确认发送完所有数据后,发送
FIN
与seq=w
,ACK= u+1
给客户端,之后进入LAST_ACK
状态。第四次
客户端收到服务器的
FIN
后,发送ACK= w+1
,seq= u+1
。
3. 状态码
- 1xx 信息性,代表请求已被接受,需要继续处理。
- 2xx 成功
- 200 请求已成功
- 201 表示资源已被新建
- 204 成功但是不返回内容
- 3xx 重定向
- 301 资源永久转移
- 302 临时转移
- 304 缓存未过期,可以直接使用
- 4xx 客户端错误
- 400 语法错误,服务器无法理解
- 401 身份认证错误
- 403 无权限访问
- 404 资源找不到
- 409 资源冲突
- 5xx 服务端错误
- 500 未知错误(服务器源代码、数据库错误)
- 502 网关错误
- 503 服务器超载或维护
- 504 网关请求超时