TCP面试题(一)之TCP的三次握手和accept()的顺序

本文详细介绍了TCP的三次握手过程,并探讨了accept()函数在连接建立中的位置,及其与DDoS攻击的关系。通过实例分析,帮助读者深入理解TCP连接的建立与资源分配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     经过腾讯的六次技术面的考验,每次基本必问TCP的一些知识。因此,笔者一直都想总结一下,但由于太忙(懒),一直没有去做,趁这会儿有时间,特在此处总结下,希望对大家有帮助。

     众所周知,TCP是面向连接的协议,此处的“连接”,只是抽象的连接,即,服务端和客户端进行指定端口的数据传输,由于TCP协议是对端传送数据的,所以,两端在通讯时,就相当于通过抽象的信道,将两个端口进行连接,从而形成抽象的“连接”。

     具体数据传输过程如下图所示:


     而对于连接的建立和拆除,则分别需要三次和四次。若这部分不太清楚可以参考一下我之前的文章:TCP三次握手和四次挥手详解,这里我就不再赘述了。

     为了叙述和读者理解方便,此处贴一张图:

### TCP三次握手与四次挥手的详细过程及其作用 #### TCP三次握手的概念及原理 TCP三次握手机制是为了建立可靠的数据传输连接而设计的种通信机制。其核心目标是让客户端服务端双方都准备好接收发送数据,同时协商初始序列号。 具体过程如下: 1. **第握手** 客户端向服务端发起请求并发送个SYN包(同步标志位),表示希望建立连接,并随机生成个初始序列号`Seq=x`[^2]。 2. **第二次握手** 服务端收到SYN包后,返回个ACK包(确认标志位)以及自己的SYN包,其中包含服务器的初始序列号`Seq=y`,同时也确认了接收到的客户端序列号`Ack=x+1`。 3. **第三次握手** 客户端再次发送个ACK包给服务端,确认已经收到了服务端的SYN包,此时携带的是`Ack=y+1`,表明客户端认可服务端的初始序列号。 通过这三步操作,实现了以下两个重要功能: - 双方均知晓对方已准备好进行数据交换; - 协商好各自的初始序列号以便后续数据分段编号管理[^3]。 #### 二、TCP四次挥手的概念及原理 当数据传输完成后,为了释放资源,需要断开连接。这过程称为“四次挥手”。 以下是具体的流程描述: 1. **第次挥手** 主动关闭的方向被动关闭方发出FIN报文,表示自己不再有新的数据要发出了,但是仍然愿意接受来自另侧的信息[^4]。 2. **第二次挥手** 被动关闭方回应个ACK报文作为应答,通知主动关闭方它已经知道了即将结束会话的消息。 3. **第三次挥手** 接着,被动关闭方也会发送个FIN报文告知主动关闭方自己也没有更多数据待传。 4. **第四次挥手** 最终,主动关闭方回复最后个ACK报文来确认整个终止过程完毕。 值得注意的是,在实际应用中可能存在时间差等因素影响,因此采用这种较为保守的方式确保彻底切断链接关系。 ```java // 示例代码展示如何创建Socket连接模拟三次握手 try (ServerSocket serverSocket = new ServerSocket(8080)) { System.out.println("等待客户端连接..."); Socket socket = serverSocket.accept(); System.out.println("客户端已连接!"); } catch (IOException e) { e.printStackTrace(); } ``` 上述代码片段展示了基于Java实现的个简单服务器监听程序,虽然这里并未直接体现三次握手细节,但它隐含了底层网络协议栈执行该逻辑的事实。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值