OSI五层网络模型
- 物理层
利用传输介质为数据提供物理连接,传输比特流。 wifi 、光纤 等 - 数据链路层
在两个相邻结点之间传送数据,传输数据帧 - 网络层
提供路由和寻址的功能,使两终端系统能够互连且决定最佳路径。 IP协议 - 传输层
向用户提供可靠的端到端的差错和流量控制,保证报文的正确传输,负责向两个主机中进程之间的通信提供服务。 TCP , UDP - 应用层
为用户提供的服务。 http,https 协议
TCP
TCP 三次握手
1 | client ---- SYN=1,seq=j ----------> server |
为什么需要三次,而不是两次?
如果试了两次握手,client端第一次发送到服务端,服务端即会认为建立连接。但是网络是会延迟或丢包的,如果第一次发生了客户端的握手发生了延迟,客户端会超时重传,这样就有可能服务端收到多个建立连接的消息,导致连接建立多次。
TCP 四次挥手
1 | client ---- FIN=1,seq=x ----> server |
- 客户端发送关闭连接的报文, FIN 标志位为1
- 服务端收到FIN后,发送确认报文
- 服务端继续发送剩余的报文,客户端继续接收剩余报文
- 服务端报文发送完毕,向客户端发送FIN报文
- 客户端向服务端发送确认报文,客户端等待一段时间后进入closed状态。 服务端收到确认报文即进入closed状态
为什么挥手要四次不是三次?
因为客户端发起关闭连接报文时,服务端可能还有剩余的数据没有发送完毕。 要等待服务端将剩余的数据发送完毕。
客户端收到FIN后为什么要等待一段时间在进入closed状态?
因为客户端发送的确认报文有可能丢失,这样,服务端会重复发送FIN报文; 如果客户端收到FIN立即关闭,就无法处理服务端重复发送的FIN报文。
和UDP相比,为什么TCP是可靠的
TCP有超时重传机制。 当TCP报文发出,会启动计数器,等待接收端返回确认报文。如果长时间没有收到确认报文,会将报文重新发送
http
http版本迭代
http1.1
Connnection: Keep-Alive
复用tcp连接。 允许HTTP设备在事务处理结束之后将TCP连接保持在打开的状态,以便未来的HTTP请求重用现在的连接支持只请求数据的一部分 range
RANGE:bytes=XXXX 表示要求服务器从文件 XXXX 字节处开始传送,断点续传
http2.0
多路复用。
多个请求并行的复用一个连接。
和 keep-alive 的区别: http1.1 的复用是串行的,如果有一个请求耗时较长会阻塞。http2.0 是并行复用,不会阻塞
https
1 | client ---- 请求https连接 ----> server |
get 和 post 的区别
- get相对于post请求更安全,以为get请求的参数暴露在url上
- get请求一般有长度限制,但是这并不是协议规定的长度限制。而是浏览器或服务器因为性能原因而做出的限制。
- okhttp缓存的key是url。 而post请求包含了body。 所以okhttp只能缓存get请求。
WebSocket
WebSocket 支持客户端和服务端双向通信
使用http协议建立连接
客户端发起协议升级请求
1 | GET / HTTP/1.1 |
- Connection: Upgrade:
表示要升级协议 - Upgrade: websocket:表示要升级到websocket协议。
- Sec-WebSocket-Version: 13:表示websocket的版本。如果服务端不支持该版本,需要返回一个Sec-WebSocket-Versionheader,里面包含服务端支持的版本号。
- Sec-WebSocket-Key:与后面服务端响应首部的Sec-WebSocket-Accept是配套的,提供基本的防护,比如恶意的连接,或者无意的连接。
服务端返回
1 | HTTP/1.1 101 Switching Protocols |
返回101状态码,表示WebSocket建立成功
ping、pong
保持tcp连接不断开
WebSocket 和 keep-alive 的区别
http 的 keep-alive 是为了复用tcp连接。 每一次http请求都必须发送完整的http报文。 只能由客户端发起请求,服务端被动响应。
WebSocket 的报文比http报文格式简单,支持服务端主动给客户端发消息。