大厂高频网络面试题之tcp的三次握手

1、三次握手

client端为A,server端为B,双方一开始都是closed状态
备注:ack标记位表示希望对方下次发给我的数据包的序号;seq为当前数据包的序号;SYN表示想和对方简历连接;ACK表示这是一个响应包。
1)请求连接:A向B发起了syn包,即(标记位)syn=1,(序列号)seq=x的包,此时A进入syn_sent状态。
2)响应请求:B响应A发送的syn包,向A发送了1个SYN+ACK包,即syn=1,ACK=1,ack=x+1,seq=y的数据包,此时B进入syn_revd状态。
3)确认握手:A收到了B的同意,向B发送1个ACK包,即ACK=1,seq=x+1,ack=y+1的数据包,此时A进入ESTABLISHED状态;B收到了A的ACK包时,此时B也进入ESTABLISHED状态;开始与A进行数据传输。
通俗易懂的语言:
 A告诉B:“我想连你”。
 B告诉A:“行,来连吧”。
 A再跟B说:“那我开始连你了哦,我要发送数据了哦”。
 后来王子跟公主过上了幸福的生活。

2、为什么是三次?

2.1、假设是2次握手

情景1:
1)A的请求连接q1由于网络滞留,没发送到B
2)A没有及时收到确认,又发送了一个连接请求q2,然后B正常响应了,开心的完成了通信
3)此时q1到达了B,B以为A又来连接了,就响应了A,并跟A建立连接,然而苦苦等待,却等不到A的任何数据,因此白白浪费了B的资源。
情景2:
1)A向B发送请求连接
2)B收到请求连接后,响应A,然后开始为了A建立连接;但假如B的确认包丢失时,B建立的这个连接就是单向连接,从而浪费资源。

2.2、假设是4次握手:

情景:
A:“喂,你听得到吗?”
B:“我听得到呀,你听得到我吗?”
A:“我能听到你,你能听到我吗?”
B:???
总结:这个例子很显而易见,我们至少在第3次握手时,就能确认对方是否能相互听的到了,再多问也是徒劳无功。

第三个包丢了,但A已经变成已连接Established状态了,怎么办?
a. 假定此时双方都没有数据发送,B会周期性超时重传,直到收到A的确认,收到之后B的TCP 连接也为 Established状态,双向可以发包。
b. 假定此时A有数据发送,B收到A的 Data + ACK,自然会切换为established 状态,并接受A的 Data。
c. 假定B有数据发送,数据发送不了,会一直周期性超时重传SYN + ACK,直到收到A的确认才可以发送数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值