在前面的文章中我们了解到http是基于TCP/IP协议的,这篇文章我们来了解一下TCP/IP。
一、TCP与UDP
1、UDP
基于非连接。类似于写信,不能保证对方能不能接收到,接收到的内容是否完整,顺序是否正确。
优缺点:性能损耗小,占用资源少,稳定弱,速度块。
2、TCP
基于连接,类似与通话,能够确认对方能够准确的接收到发送的信息。
优缺点:数据传输可靠,支持全双工,建立时间和消耗资源过大,有延迟,效率相对较低。
二、TCP建立连接和断开连接
1、三次握手建立连接
(1)作用
三次握手是TCP用来建立连接的一种机制,确保双方可以正常通信。每一步都需要对方的确认才能进行下一步,从而确保双方都同意建立连接,并且状态得到正确同步。这样可以减少因网络延迟、丢包等问题导致的连接建立失败或错误。
(2)建立过程
- 第一次握手:客户端发送SYN包,客户端向服务器发送一个SYN(同步)包,其中包含一个初始序列号(ISN)作为起始值。此时客户端处于SYN_SENT(同步已发送)状态。
- 第二次握手:服务器回复SYN-ACK包,服务器收到客户端的SYN包后,会生成自己的初始序列号,并对客户端的SYN进行确认。服务器构造一个SYN-ACK(同步-确认)包,将自己的初始序列号作为起始值,同时也将确认号设置为客户端初始序列号加一。然后服务器发送这个SYN-ACK包给客户端。此时服务器处于SYN_RCVD(同步已接收)状态。
- 第三次握手:客户端发送ACK包,客户端收到服务器的SYN-ACK包后,确认服务器的初始序列号和确认号,并构造一个ACK(确认)包,将确认号设置为服务器初始序列号加一。客户端发送这个ACK包给服务器。此时客户端处于ESTABLISHED(已建立连接)状态,服务器收到ACK包后也转入ESTABLISHED状态。
- 三次握手完成,客户端和服务器正式建立了TCP连接,可以进行数据的传输。
(3)注意事项
①握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。
②如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP协议引入了超时机制。TCP为每个连接都设置了一个定时器,用于在一定时间内检测连接是否还处于活动状态。如果在规定时间内没有收到客户端的数据,则服务器认为客户端已经断开连接,并会关闭连接。
(4)为什么不能用两次握手?
- 确保双方都愿意建立连接:在两次握手的情况下,客户端只发送一次连接请求,但服务器无法确认客户端是否真正希望建立连接,因为可能只是一个错误的或者重复的请求。通过三次握手,服务器可以回复确认信号来确认客户端真正的通信意愿。
- 防止已失效的连接请求影响:如果使用两次握手,可能会遇到客户端已经发送了一个连接请求,在网络中滞留了一段时间后终于到达服务器,导致服务器误认为客户端希望建立连接。而通过三次握手,服务器可以得到客户端最新的连接请求,并且可以排除掉之前的已失效的连接请求。
- 同步双方的初始序列号:在TCP连接中,每个连接都有一个初始序列号(ISN)用于标识数据流的起始位置。通过三次握手,双方可以交换彼此的初始序列号,从而实现双方序列号的同步,确保后续传输的数据能够正确地按序组装和重组。
2、四次挥手断开连接
(1)作用
是用于关闭TCP连接的过程。它是在双方确认不再需要通信时,进行连接释放和资源回收的步骤。在这个过程中,双方都需要发送FIN和ACK两个标志位的报文段,以确保双方都知道对方已经确认了关闭连接的请求。最后,当双方都收到了对方发送的ACK报文段后,连接就顺利关闭,并且可以回收连接所占用的资源。
(2)建立过程
- 第一次挥手:客户端发送连接释放请求(FIN),当客户端确定不再发送数据时,它会发送一个带有FIN标志位的报文段给服务器,表示请求关闭连接。此时,客户端进入FIN-WAIT-1(终止等待1)状态。
- 第二次挥手:服务器回复确认客户端的请求(ACK),服务器收到客户端的连接释放请求后,会发送一个带有ACK标志位的报文段给客户端,确认收到了客户端的请求。服务端就进入了CLOSE-WAIT 关闭等待状态。
- 第三次挥手:服务器发送连接释放请求(FIN),客户端接收到服务器端的确认请求后,客户端就会进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文,服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
- 第四次挥手:客户端回复确认服务器的请求(ACK),客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态,但此时TCP连接还未终止,必须要经过2MSL后(最长报文寿命)客户端才会进入CLOSED关闭状态,服务器端接收到确认报文后,会立即进入CLOSED关闭状态,到这里TCP连接就断开了,四次挥手完成
(3)注意事项
为什么客户端要等待2MSL?
确保连接彻底关闭,并在此期间处理延迟报文段和防止端口冲突,从而保证网络通信的可靠性和稳定性。