您的位置:首页 > 理论基础 > 计算机网络

TCP为什么需要三次握手和四次挥手

2017-02-16 16:23 477 查看
首先,我们要知道网络传输是有延迟的,可能丢失的,不是说A发一个包给B,B保证能立刻收到,甚至B可能一直收不到。

三次握手

第一次。A跟B说,我要建立连接了。

第二次。B跟A说,OK,那我也建立连接。

第三次。A跟B说,嗯,我知道了。

第二次和第三次都是为了保证连接是可靠的。

假设只有一次握手,而A的包无法发到B那里去,那A就是自顾自的建立了连接,傻傻的发信息,却不知道对方其实根本收不到。所以第二次握手是为了告诉A,B收到了你的信息。

假设只有两次握手,那么对B来说,B是不知道A是否收到了自己的信息的,第三次握手是为了告诉B,A收到了B的信息了,并且可以互发信息了。 B真的需要知道 A是否收到了自己发出的第二次握手的信息吗?是的,如果A的第一次握手因为某些原因延迟很久才到B,而其实现在A和B已经聊完天,关闭连接了,这时B发出第二次握手,而A已经没什么想跟B说的,就不会发出第三次握手,这样B就不会建立连接消耗资源。若是只有二次握手的这种情况,B会直接建立连接消耗资源。

四次挥手

第一次。A跟B说,我要断开连接了。

第二次。B跟A说,好的,我知道了,我不再接收你的信息了。

第三次。B跟A说,我传给你的信息传完了,你可以关闭连接了。

第四次。A跟B说,好的,我关闭连接了。

第二次挥手是为了告诉A,B知道你不再发送信息了,且B不再接收信息。但B仍可以向A发送信息。因为A是主动关闭的一方,但B可能仍然有信息未发送完。

第三次挥手是为了告诉A,B的信息发完了,A你可以关闭连接了。

第四次挥手是为了告诉B,A我知道可以关闭连接了,你也可以关闭了。对B来说,第四次挥手B才知道A成功关闭连接了,不关闭很耗费资源,所以要保证关闭了。若B接收不到第四次挥手信息,将会继续第三次挥手,直到收到确认信息为止。

注意:对A来说,第四次挥手后2MSL内未接收到B的第三次挥手信息才会关闭连接,否则会继续第四次挥手。防止B接收不到第四次挥手信息。(若B接收不到第四次挥手信息,将重复发送第三次挥手信息,这个2MSL就是如果真的有重复发送的第三次挥手信息,在这个时间内肯定到达A了(路由不出问题的话),就是为了保证B收到第四次挥手信息)

另,TCP报文有 序号(seq) 和 确认号(ack)

序号是对要发送的数据进行编号。

确认号是上一个接受的数据的序号+1,同时也是下一次期望接受的数据的编号。

这个序号和确认号还有防止DDOS攻击的作用,比如我伪装很多虚假IP向服务器第一次握手,而服务器向那些IP发出第二次握手请求,但因为我是接收不到第二次握手的序号的信息的,那我伪造的第三次握手就不能成功,就不能骗服务器不断创建连接,消耗资源了。(这不能避免服务器就一直进行第二次握手)

还有符号位,FIN,SYN,ACK等

SYN=1是连接请求或连接接受的意思

ACK=1是这是一个确认报文的意思

FIN=1是释放连接的意思。(比如A对B发FIN=1的报文,表示A不再发报文,所以第一、三次挥手的FIN位是1)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息