- TCP三次握手的过程
SYN=1表示这是一个连接请求的意思
ACK=1表示对序列号的一个确认,当这个值=1的时候,确认号ack才有效的
ack=x+1表示确认号,表示的是接收方期望下一次握手的时候收到的序列号值是x+1,即第三次握手的时候,seq=x+1
通俗解释:
①第一次握手:发送方发送一个报文给接收方,说:"哥们好"
②第二次握手:所以接收方发送一个报文给发送方说:"我收到你发送得消息了"
③第三次握手:所以发送方再次发送一个报文给接收方说:"我知道你收到我的消息了"
假设老板就是发送方,员工是接收方。
老板和员工通过即时通讯软件聊天。
老板说:"老王,麻烦你做一件什么什么事"。(相当于第一次握手)
老王说:"好的老板!"。(相当于第二次握手)
老王担心 "好的老板!"这个消息不知道是否到达老板那边,要是消息没有到达老板那里,老板岂不是误认为我不理他?
老板为了老王不要那么担心焦虑,于是再次发送了一个消息給老王:"老王,我知道你确定要做这个事儿了,好好加油干哦"。(相当于第三次握手)
这时候,老王才松了一口气
①其中seq=x相当于老板給老王的任务,y相当于老王说的 "好的老板"。
②由于老王心里不安,不知道老板是否收到消息,于是期望老板响应自己,給自己一个定心丸,这个期望,就相当于ack=x+1。这时候老板确实给了老王定心丸,老板说:"我知道你愿意为我干这件事儿"。老板说的这句话,就相当于seq=x+1。
③这个seq=x+1就说明 达到老王的期望了,老王就不会再担心老板是否能收到了。
其中,相对于发送方来说,第一次握手和第二次握手这样一发一收的过程,是同步已发送的一个过程。
相对于接收方来说,第二次握手和第三次握手这样一发一收的过程,是同步已接收的过程。
相对于发送方,到达第二次握手,就已经建立连接了。
相对于接收方,第三次握手结束,才算已经建立连接。
之后,才可以进行数据传输。
- 为什么要三次握手呢?两次握手难道就不行吗?
两次握手会产生什么问题呢?它会产生这样一个问题:
已经失效的连接请求报文传达到对方,引起错误。这是什么意思呢?
当只要两次握手,发送方就可以建立连接,这种情况我们来分析一下
①发送方第一次发送报文的时候,很久才到达接收方,于是发送方认为是超时传输,于是重传
②重传的时候,报文很快被接收方收到了,也很快得到了确认消息
但是上次发送的超时报文到达接收方以后,接收方照样发送确认包給发送方
这时候,发送方就收到2个确认包。很显然,这样就引起了错误。
如果进行第三次握手,发送方发送的超时报文还没有收到确认(第二次握手),重传的那个报文已经进行第三次握手了,即使发送方收到超时报文的确认(第二次握手),也不会进行第三次握手了,因为重传报文已经进行第三次握手了,超时报文直接抛弃掉,什么都不做。
这就是为什么要三次握手的原因,第三次握手,就是解决 "已经失效的连接请求报文传达到对方,引起错误" 的问题