目录
TCP
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。TCP旨在适应支持多网络应用的分层协议层次结构。
主要特点
TCP是一种面向广域网的通信协议,目的是在跨越多个网络通信时,为两个通信端点之间提供一条具有下列特点的通信方式:
- 可靠通信方式;
- 基于流的方式;
- 面向连接;
- 在网络状况不佳的时候尽量降低系统由于重传带来的带宽开销;
- 通信连接维护是面向通信的两个端点的,而不考虑中间网段和节点。
TCP的三次握手与四次挥手
TCP是因特网中的传输层协议,使用三次握手协议建立连接。建立一个连接需要三次握手,而终止一个连接要经过四次握手,这是由TCP的半关闭(half-close)造成的。
三次握手:
- 客户端A发送连接请求到服务器B;
- 服务器B接收到客户端A发送的信息后必须确认信息,于是给服务器B发送状态码,并进入SYN_RECV状态;
- 客户端A接收到服务器B的状态后回应服务器端B,并进入Established状态 。
三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。
四次挥手:
- 若客户端A认为数据发送完成,则它需要向服务端 B 发送连接释放请求。
- B收到连接释放请求后,告诉应用层要释放TCP连接,然后会发送ACK包,并进入CLOSE_WAIT状态,此时表明A到B的连接已经释放,不再接收A发的数据了。但是因为TCP连接是双向的,所以B仍旧可以发送数据给A。
- B如果此时还有没发完的数据会继续发送,完毕后会向 A 发送连接释放请求,然后 B 便进入 LAST-ACK 状态。
- A 收到释放请求后,向 B 发送确认应答,此时A进入TIME-WAIT状态。当B收到确认应答后,也便进入CLOSED状态。
为什么连接时候是三次握手,关闭连接时候需要四次挥手?
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到Server端所有的报文都