三次握手

TCP连接建立使用三次握手的原因有几个方面:

1. **可靠的数据传输**:
   - 通过三次握手可以确保双方都能够正确地接收对方的数据包,从而保证了连接的可靠性。每次握手都是对前面一个步骤的确认。

2. **防止已过期的连接请求报文段突然又传送到了服务端**:
   - 如果只用两次握手,可能出现这样一种情况:客户端发出的第一个连接请求(SYN)由于网络问题延迟到达服务器,而在延迟期间客户端重新发起了新的连接请求并完成了正常的三次握手过程。此时,延迟的旧请求到达服务器,服务器会误以为是一个新的连接请求而接受并发送SYN-ACK回应。这种情况下,如果只使用两次握手,客户端就会错误地认为连接已经建立,但实际上服务器并不知道这是重复的请求。三次握手可以避免这种情况的发生,因为客户端会在第二次握手后等待对方的确认(ACK),如果未收到则不会认为连接已建立。

3. **确定初始序列号**:
   - 在三次握手的过程中,客户端和服务器都会发送自己的初始序列号(ISN)。这些序列号用于标识后续数据传输中的数据片段,确保数据的顺序性和完整性。通过三次握手,双方能够确定彼此的初始序列号,为后续的数据传输做好准备。

4. **同步状态信息**:
   - 在三次握手的过程中,双方还可以同步其他状态信息,如窗口大小等,这对于后续的数据传输非常重要。

综上所述,三次握手机制不仅保证了连接的建立是双方明确同意的结果,而且还确保了连接的可靠性、数据的完整性和有序性。因此,三次握手是TCP连接建立过程中不可或缺的一部分。
全部评论

相关推荐

头像
10-30 14:44
已编辑
门头沟学院 Java
1. 自我介绍2. java底层数据结构(数组、栈、链表、队列)的特性和使用场景3. 大量数据的存储用哪种方式合适4. jdk8的hashmap底层实现5. hashmap链表转红黑树的触发条件,以及什么时候转回去6. hashmap和concurrenthashmap的区别,以及后者如何保证效率的同时,保证线程安全7. 线程池的核心参数,以及执行顺序8. java里面用过哪些锁9. ReentrantLock的底层实现原理,AQS怎么实现10. CAS里面使用volatile 保证了什么属性实现这种安全性11. 内存中基于什么操作来保证的12. volatile修饰的变量有什么特别的吗13. 双亲委派模型14. jvm运行数据区的构成以及作用15. 垃圾回收算法16. 老年代和年轻代用的什么算法17. Rabbitmq的消息可靠性怎么保证,重复消费问题18. mq怎么保证消息的顺序性19. 怎么实现消息的幂等性20. MySQL中innodb底层索引实现和MVCC,以及MySQL默认的隔离级别21.  redis底层数据结构,为啥使用跳表不用别的数据结构22. redis持久化机制的方式,以及内存淘汰策略23. redis的缓存一致性怎么实现24. 分布式锁用吗?Redisson如何加锁解锁操作?25. spring的循环依赖怎么解决,哪种注入方式可以解决,哪种方式不可以解决26. Mybatis里面的xml如何解析成Spring的bean注入到容器里面的27. 统计每个接口总的调用次数,放在SpringCloud组件哪个位置28. gateway通常用来干什么的29. 做完这些项目最后挑战或者成就感的是什么反问环节。。。。。。ps: 面试官很好,不会的会解释,然后会跟着简历来问问题。10.30  进二面#数据人的面试交流地##数字马力面经##面经#
查看58道真题和解析 数据人的面试交流地
点赞 评论 收藏
分享
2 1 评论
分享
牛客网
牛客企业服务