赞
踩
答:
第一次握手:客户端向服务端发送SYN请求报文,表示希望向服务端发起连接进行数据同步。
SYN报文中,客户端会随机生成一个序列号client_isn,SYN标志位为1
第二次握手:服务端向客户端发送ACK+SYN报文,表示收到客户端的连接请求,“客—>服”正常。
ACK+SYN报文中,服务端通过确认应答号client_isn+1,表示收到客户端的连接请求。
服务端也会生成一个序列号server_isn发送给客户端。
第三次握手:客户端向服务端发送ACK确认报文,表示收到服务端消息,“服—>客”正常。
客户端向服务端发送ACK确认报文后,客户端进入ESTABLISHED 状态。
若服务器收到客户端的ACK应答报⽂后,也进⼊ ESTABLISHED 状态。
双方都处于ESTABLISHED 状态,连接完成,可以相互通信。
注:第三次握⼿是可以携带数据的,前两次握⼿是不可以携带数据的
答:
根本原因是无法验证服务端到客户端的正常通信。
TCP是全双工通信,两次握手只能保证客户端到服务端这个单向链路是正常的,不能保证服务端到客户端这个链路正常。
因为没有第三次握手,服务端不知道客户端有没有收到自己的消息,所以如果此时服务端就开始发数据传输给客户端,客户端可能压根就收不到。
还有个问题是,由于服务端不知道客户端是否收到自己消息,对于客户端因网络阻塞而重复发送的多个SYN请求报文,只能来一个,就建立一个连接,导致建立多余的无效连接。
有了第三次握手,客户端在收到服务的SYN+ACK报文后,可以判断此次连接是否是历史连接,即是否过期,如果过期,客户端可以通过第三次握手发送RST报文给服务端,表示终止这一次连接。
答:
1.客户端发送 syn0 给服务器
2.服务器收到 syn0,回复 ack(syn0+1)
3.服务器发送 syn1
4.客户端收到 syn1,回复 ack(syn1+1)
因为 tcp 是全双工的,上边的四部确认了数据在两个方向上都是可以正确到达的,但是 2,3 步没有没有上下的联系,可以将其合并,加快握手效率,所有就变成了 3 步握手。
答:
三次握⼿才可以阻⽌历史连接(主要原因),确保当前连接是最新的。
三次握⼿才可以同步双⽅的初始序列号,确保双向都能正常通信。
三次握⼿才可以避免资源浪费,避免二次握手的多次建立连接,加快四次握手的效率。
答:
第一次挥手:客户端打算关闭连接,发送FIN报文
第二次挥手:服务端收到客户端断开连接请求,发送ACK应答报文。
第三次挥手:服务端处理完剩余数据,发送FIN报文。
第四次挥手:客户端收到了剩余数据,发送ACK应答报文。断开结束。
答:
关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据。
服务器收到客户端的 FIN 报⽂时,先回⼀个 ACK 应答报⽂,表示收到断开请求。
⽽服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报⽂给客户端来表示同意关闭连接。
客户端最后还有回一个ACK报文给服务端,是让服务端知道客户端确实关闭了,那么现在服务端也可以正式关闭了。
答:
是否可以将服务端发送ACK和FIN合并?不能,因为剩余数据可能需要很长时间传输,如果一直不给客户端发送ACK确认报文,导致客户端一直重发。
客户端最后一个ACK确认报文是否可以不要?不能,因为服务端不知道客户端是否关闭了。
答:
MSL 是 Maximum Segment Lifetime,报⽂最⼤⽣存时间,它是任何报⽂在⽹络上存在的最⻓时间,超过这个时间报⽂将被丢弃。
2MSL 的时间是从客户端接收到 FIN 后发送 ACK 开始计时的。
如果在 TIME-WAIT 时间内,因为客户端发送的 ACK没有传输到服务端,客户端⼜接收到了服务端重发的 FIN 报⽂,那么 2MSL 时间将重新计时。
因此2MSL可以保证服务端没有收到ACK应答报文,还能将超时重传的FIN报文再发送给客户端。
如果客户端2MSL内还未收到超时重传的FIN报文,表明双方已经成功关闭连接。
还有一个作用是若TIME_WAIT 等待的时间过短,可能导致本次连接已经关闭,但是发送方仍然有数据没有到达接收端。更严重的是,如果此时已经建立具有相同四元组的连接,旧连接的数据包很可能进入新连接传输,导致数据错乱。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。