0x00 TCP简介
传输控制协议(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
0x01 TCP固定头部结构
在tcp层的flags字段,有六个标识,SYN(建立连接)、ACK(表示响应)、FIN(关闭连接)、PSH(push数据传输)、RST(reset重置连接)、URG(urgent紧急);以及系列号seq number和确认号ack number;
- 如果只有单个SYN,表示
建立连接
。 - 如果同时有SYN和ACK,表示建立连接后的响应。
- 一般地,当出现FIN包或RST包时,我们便认为客户端与服务器端断开了连接;而当出现SYN和SYN+ACK包时,我们认为客户端与服务器建立了一个连接。
完整过程uml时序图如下:
0x10 状态转移
- 客户端TCP状态迁移:closed -> syn-send -> established -> fin-wait-1 -> fin-wait-2 -> time-wait -> closed
服务端TCP状态迁移: closed -> syn-rcvd -> established -> close-wait -> last-ack -> closed
- LISTEN - 侦听来自远方TCP端口的连接请求;
- SYN-SENT -在发送连接请求后等待匹配的连接请求;
- SYN-RECEIVED - 在收到和发送一个连接请求后等待对连接请求的确认;
- ESTABLISHED- 代表一个打开的连接,数据可以传送给用户;
- FIN-WAIT-1 - 等待远程TCP的连接中断请求,或先前的连接中断请求的确认;
- FIN-WAIT-2 - 从远程TCP等待连接中断请求;
- CLOSE-WAIT - 等待从本地用户发来的连接中断请求;
- CLOSING -等待远程TCP对连接中断的确认;
- LAST-ACK - 等待原来发向远程TCP的连接中断请求的确认;
- TIME-WAIT -等待足够的时间以确保远程TCP接收到连接中断请求的确认;
- CLOSED - 没有任何连接状态;
0x11 为什么需要三次握手
因为tcp协议是全双工模式,双方都需要确认4个信息,己方发送/接受和对方发送/接受能否完成。
0x100 为什么建立连接是三次握手,而关闭连接是4次挥手
因为在建立连接的第二次握手中,确认号和ACK响应可以同时发送;而在关闭连接时,当服务端收到FIN时,有可能还需要继续向客户端发送数据,所以第二次挥手的ACK和第三次挥手的FIN不能同时发送。
另外,主动关闭连接的可以是客户端也可以是服务端。