okhttp3.6.0源码分析准备1——TCP协议
2017-11-29 本文已影响30人
hello_小丁同学
简介
Tcp协议是传输层协议,是一种可靠的协议。
tcp报文首部
- Sequence number :是指报文段的序号值,当SYN状态为1时,会初始化一个sequence 序号
- Acknowledgment number:是指期望收到对方下一个报文段的序号值。当ACK状态为1时,同样会初始化一个sequence 序号
- SYN 当SYN 为1时表示这是一个请求连接报文段
- ACK 标识Acknowledgment number是否有效,在客户端发送最初的初始化包之后,所有的包都要将该标志置为1
- FIN 该标志为1表示,最后一个包已经发送完成
三次握手
TCP协议只有在经过三次握手之后连接才会建立。
一开始Server会监听指定的端口,等待连接请求。
- 第一次握手:Client发出连接请求,发送一个报文,这个报文的SYN位为1,初始化一个Sequence number为c,进入SYN-SENT状态。
- 第二次握手:Server收到请求报文,如果同意连接,则会向Client端发送一个报文,该报文的SYN位为1,ACK位为1,Acknowledgment number为 c+1,同时初始化Sequence number为s,进入SYN-RECEIVED状态。
- 第三次握手:Client收到Server发出的报文,会检查收到的报文的ACK是否为1,Acknowledgment number是否为 c+1,如果正确,需要再向Server发送一个报文,该报文的 SYN不为1,ACK 为1,Sequence number = + 1,然后进入ESTABLISHED 状态,连接建立。
四次挥手
tcp断开连接TCP断开连接需要经历四次挥手
这时候,Server或者Client都可以发起断开连接请求,以Client主动发起断开连接为例
- 第一次挥手:Client发送一个报文,FIN为1,Sequence number为cf,进入 FIN-WAIT-1状态
- 第二次挥手:Server收到Client发送的报文后,检查如果FIN状态,如果FIN=1,会发送一个报文,该报文的 ACK为1, Sequence Number为cf+1,进入 CLOSE-WAIT 状态。客户在收到报文之后,进入FIN-WAIT-2状态
- 第三次挥手:Server往Client发送一个报文,该报文的FIN为1,Sequence Number为sf,同时进入LAST-ACK状态
- 第四次挥手:Client在收到Server状态之后,会检查FIN是否为1,如果为1,就会往Server发送一个报文,该报文的ACK为1, Sequence Number为sf+ 1,同时进入TIME-WAIT状态,Client在等待2MSL
之后会关闭,服务端在收到给报文之后也会关闭。
参考: