一、TCP传输的过程-三次握手
1.建立连接并确认连接(三次握手)
** 过程: **
(1)客户端向服务端发出连接请求SYN=1,seq=x,等待服务端响应.状态由CLOSED转为SYN_SENT
(2)服务端做出响应ACK和连接信号SYN=1,seq=y,状态由LISTEN转为SYN_RECEVD
(3)为防止数据丢失,客户端也要做出响应ACK,确认是否有效,seq=x+1。客户端和服务端状态均变未ESTABLISH
2.为什么要进行三次握手
(1)确保客户端/服务端均有接受和发送功能
(2)防止失效的连接请求到达服务器,让服务器错误打开连接
(3)防止建立多个冗余连接,造成不表的资源浪费
3.为什么不是4次
三次在理论上可以最少的建立可靠连接,不需要使用更多的通信次数
4 .进行数据传输,发送数据包
数据传输总是从 客户端—》服务端,因此客户端和服务端不是固定的。
二 、TCP传输的过程-四次挥手
1、四次挥手过程
1.(客户端:终止等待1)客户端向服务端发起关闭连接的请求FIN=1,不再发送数据了,客户端进入FIN_WAIT_1状态,但如果服务器发送数据,客户端还要接收
2.(服务端:关闭等待)服务端收到FIN,可能还有数据未传输完毕,还无法完成关闭,所以先响应客户端发送ACK,表示收到关闭请求。服务端进入CLOSE_WAIT状态
3.(客户端:终止等待2)客户端收到服务器的确认请求后,客户端进入终止等待2(FIN_WAIT_2),等待服务端发送连接释放报文
4.(服务端:最后确认)等服务器的数据传输工作完成,就把FIN信号(连接释放报文)发送给客户端,可能还会发送一些数据,服务端进入LAST_ACK状态
5.(客户端:时间等待)客户端收到服务器的FIN连接释放报文。发出确认ACK,客户端进入TIME_WAIT状态
6.(服务端:CLOSED)服务端收到客户端的确认ACK,立即进入CLOSED状态
7.客户端TIME_WAIT持续2被的MSL时长,在Linux中大约60s,之后也进入CLOSED状态
8.服务器结束TCP连接的时间比客户端早
2、为什么四次挥手
让服务端发送还未发送完成的数据,客户端知识不再发送数据,但还可以接收数据
3、为什么TIME_WAIT是2MSL
(1)确保客户端的确认报文ACK能到达服务端,如果服务端没有收到客户端发来的确认,就会重新发送关闭连接的报文
(2)确保两个传输方向上的尚未被接收活迟到的报文段都已经消失,否则如果关闭连接后,两端在原来的端口又重新建立新连接,可能导致老连接的迷途报文被新的连接收到而被误解(被误解可能以为对方要关闭连接)。
扩展:
MSL:报文最大生存时间,超过这个时间,报文就会消失