TCP协议
是一种面向连接的、可靠的、基于字节流的传输层通信协议。面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据包之前必须先建立一个TCP连接。TCP使用的流量控制协议是可变大小的滑动窗口协议。
注:在一个TCP连接中,仅有两方进行彼此通信。广播和多播不能用于TCP。
建立连接——三次握手
- 客户端发送SYN到服务器
- 服务器收到SYN,发送ACK,SYN到客户端
- 客户端收到服务端数据,发送确认ACK到服务端,客户端进入ESTABLISHED状态,服务端收到确认也进入ESTABLISHED状态。
三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。
终止连接——四次挥手
- 客户端发出连接释放报文FIN到服务端
- 服务端收到客户端发来的连接释放报文,发送确认包到客户端
- 服务端将未发送的数据都发送完毕后,发送连接释放报文FIN到客户端
- 客户端接收到服务端的释放连接报文,发送确认包到服务端,进入TIME_WAIT状态,服务端收到应答立马关闭此连接。
为什么建立连接握手需要三次而不是两次?
防止已经失效的连接请求突然又传送到了服务器,从而产生错误。
举个列子,假使客户端发送了一个连接请求,但是因为网络的问题该请求滞留的时间比较长,客户端就会认为说“哎,服务器没有收到我发送的请求”,这时候客户端会怎么做呢?再次发送连接请求,假使这次连接建立成功,那么客户端在发送完毕之后断开,刚好之前滞留的连接请求到达了服务器,这时候客户端和服务器再次建立了连接,浪费了资源。
为什么连接需要三次握手而断开需四次挥手?
这是由于TCP的半关闭造成的。
在建立连接时,SYN和ACK可以一同发送到客户端,而断开连接时,只是客户端不再发送数据了,但还可以接收数据,服务端也不一定所有数据都已经传给对方,所以就可以先发送数据,之后再去发送FIN报文,所以就需要四次挥手。