(1)为什么连接的时候是三次握手,关闭的时候却是四次挥手?
服务器在收到客户端的 FIN 报文段后,可能还有一些数据要传输,所以不能马上关闭连接,但是会做出应答,服务器向客户端响应 ACK 报文段。接下来,服务器会继续发送数据,在数据发送完后,服务器会向客户单发送 FIN 报文,表示数据已经发送完毕,可以关闭连接。然后客户端会响应一个ACK报文,说好。(简略版:服务器的ACK和FIN一般都会分开发送,因为还有一些数据要传输,从而导致多了一次,所以需要四次挥手)
(2)TCP协议如何保证传输的可靠性?
TCP主要提供了检验和、序列号/确认应答、超时重传、滑动窗口、拥塞控制和流量控制等方法实现了可靠性传输。
1. 检验和:通过检验和的方式,接收端可以检测出来数据是否有差错和异常,假如如有差错就会直接丢弃TCP段,让发送方重新发送。
2. 序列号/确认应答:序列号的作用,能够将接收到的数据根据序列号排序,并且去掉重复序列号的数据。TCP传输的过程中,每次接收方收到数据后,都会对发送方进行确认应答。也就是发送ACK报文,这个ACK报文中带有对应的确认序列号,告诉发送方,确认接收到了哪些数据,下一次的数据从哪里发。
3. 滑动窗口:滑动窗口限制了发送方向接收方发送数据的速率。避免了发送方发送过多的数据而导致接收方无法正常处理。发送方维护一个动态调整大小的窗口。窗口大小决定了下一次可以发送的数据量。窗口大小由接收方缓冲区大小、报文数据部分的最大长度决定。
4. 超时重传:如果发送方在预设时间内没有收到某个数据段的确认应答,那么TCP协议就会假设这个数据段在网络中丢失了。在超时时间过后重新发送未被确认的数据段,直到接收到相应的确认应答为止。超时时间,是动态计算的。
5. 拥塞控制:拥塞控制是为了防止过多的数据注入到网络中,导致网络拥堵和数据包丢失。TCP采用慢启动、拥塞避免、快速重传和快速恢复等算法来探测网络的状态并动态调整发送速率。当发生网络拥塞时,TCP会减少其数据发送速率,减轻网络负担。
6. 流量控制:主要通过滑动窗口机制实现。