TCP连接的建立与释放

TCP是面向连接的,在传输报文段之前先要建立连接。发起连接请求的一方叫客户端,响应连接请求的一方叫服务端

三次握手






第一次握手:
客户端向服务端发送请求连接报文(SYN);其中报头控制位SYN=1,初始序号seq=x。并进入SYN_SENT状态,等待服务器确认;
第二次握手:
服务端收请求连接报文(SYN)后,向客户端发送确认报文(SYN+ACK)。确认报文段的首部中,ACK=1、SYN=1。确认序号:ack=x 1,同时为自己选择一个初始序号seq=y。此时,服务器进入SYN_RCVD状态;
第三次握手:
客户端收到服务器的确认报文(SYN+ACK)后,还要再向服务端发送一个确认报文(ACK)。该确认报文段首部中,ACK=1,确认号是ack=y 1,自己的序列号是seq=x 1。此包发送完毕,客户端进入ESTABLISHED状态,服务端收到确认报文后,也进入ESTABLISHED状态。
至此TCP连接建立。
三次握手过程中传送的包里不携带数据。三次握手完毕后,客户端与服务端才正式开始传输数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。

四次挥手





断开一个TCP连接则需要“四次挥手”。
此处,客户端——主动关闭方,服务端——被动关闭方。
第一次挥手:
此时两端还都处于ESTABLISHED状态,客户端停止发送数据,并发送一个请求断开连接报文(FIN)。
该报文首部中,FIN=1,序列号seq=u。
服务端接收到请求报文后,进入CLOSE_WAIT(关闭等待)状态。
也就是告诉服务端,我的数据发送完了,不会再给你发数据了。
(另,在FIN包发送之前发送出去的数据,如果没有收到服务端对应的ACK确认报文,主动关闭方依然会重发这些数据);此时,客户端还可以接受数据。
第二次挥手:
服务端收到请求断开连接报文(FIN)后,回复确认报文(ACK),确认号:ack=u 1,序列号seq=v。
客户端收到确认报文(ACK)后,进入FIN-WAIT-1(终止等待-1)状态。
现在TCP连接处于半开半闭状态,服务端如果继续发送数据,客户端依然接收。
第三次挥手:
服务端发送一个请求断开连接报文(FIN),用来终止服务端到客户端的数据传送。
该报文段首部中,FIN=1,ACK=1,确认序列号ack=u 1,序列号seq=w。
客户端接收到确认断开连接报文(ACK、FIN)后,进入FIN-WAIT-2(终止等待-2)状态。
也就是告诉客户端,我的数据也发送完了,不会再给你发数据了。
第四次挥手:
客户端收到确认断开连接报文(ACK、FIN)后,回复确认报文(ACK)给服务端。
确认序号ack=w 1。序列号=u 1。
然后进入TIME_WAIT(时间等待)状态。

注意:
此时,TCP连接还没有被释放,需要时间等待状态结束后(4min),两端才会进入CLOSED状态。
设置时间等待是因为——最后一个确认报文(ACK)可能会丢失,而需要重传。

#面经#
全部评论
赞👍
点赞 回复 分享
发布于 2019-03-25 09:18

相关推荐

03-13 13:58
已编辑
小红书_后端开发
压力有点大,三四个面试官交叉面在公司的持久化方法中,你了解AOF和ROF这些原理吗?你对MySQL的原理了解吗?比如回表是什么意思?对于TCP协议中的黏包和滑动窗口机制,你有何了解?你是否写过基于TCP的示例程序,对TCP内部机制了解多少?操作系统层面的内存管理中,虚拟地址和物理地址有何区别?是否使用过top命令查看内存占用情况,能否区分虚拟地址和物理地址?你是否有编写多线程程序的经验,能否解释一下什么是死锁以及如何避免?读写锁的特点是什么?对于分布式原理,尤其是强同步、常同步和异步同步,你了解过吗?是否了解过分布式一致性协议?在分布式系统中,如何保证全局一致性或通过分布式锁实现原子性操作?两阶段提交协议是什么?ai agent的工作原理是什么?与大模型通信的部分是由你写的吗?对于大语言模型内部的系统提示词和助手提示词有何了解?大模型的历史记录是如何实现的?在小红书的应用中,对大模型进行提示词压缩以降低token消耗的情况是如何处理的?在数据库服务平台的建设中,你遇到过哪些难以解决的问题,又是如何解决的?你如何看待数据库服务平台与你在小红书做的xxAI工作台这两个项目的不同之处?对于未来个人发展规划,你有什么想法?在工作中,对数据库的依赖程度如何?是否在个人环境尝试部署过MySQL或Redis等数据库?问实习,然后从实习接入又开始问八股了:在第一份工作或实习经历中,如何优化数据库查询性能?是否经历过根据自然语言生成查询语句的数据库查询服务开发?你这边是如何实现对接多个数据库的查询服务的?RAG中的向量库使用了什么技术?搜索服务是如何实现的?你对数据库操作熟悉到什么程度?能否举例说明MySQL重命名操作的指令?是否了解数据库同步技术,比如数据同步或数据库集群同步?对于Mongo、Redis等数据库的哨兵模式和分片集群架构是否了解?是否了解Raft协议及其在数据库中的应用?反问:IEG平台上的角色有哪些?答:在IEG平台上,平台上有平台开发的角色,大部分以DBA为主,但也包含开发角色,由专门的Java开发人员配合DBA进行一些监控和其他平台相关工作。平台上的DBA通常自行编写与底层操作相关的代码,而非前端或其他部门来完成,因为这些操作需要专业能力。整个数据库平台是如何构建的?答:整个数据库平台有分层结构,产品经理负责原型设计,产品设计师设计完成后交由前端开发人员实现。同时,数据库相关的存储、内核开发以及平台开发等也是重要组成部分,要求团队成员具备较强多面能力。面试官问:目前是否有offer,以及对中间件部分的理解?目前有一些在上海的offer。在中间件部分,各个团队都有组件开发人员负责数据库内核定制等工作,例如数据库proxy的开发。
点赞 评论 收藏
分享
📍面试公司:字节跳动🕐面试时间:01/09~01/13💻面试岗位:前端开发❓面试问题:一面:第一轮面试主要就问了一些项目相关的内容,然后问题在前端当中遇到过什么开发问题,算法题是原创的,就是翻转单词顺序二面:1. 你对前端掌握到什么程度?前端需要掌握哪些东西?2. 什么是 JS 事件循环机制?3. 什么是协商缓存?强制缓存和协商缓存有什么区别?4. 缓存过期机制是怎么实现的?5. React useState 是什么,特性和优势是什么?6. 调用 setState 之后 React 内部是怎么处理的?7. 使用 setState 有没有发现过渲染失败的问题?8. 开发中有没有遇到改了 state 但视图不更新的情况?9. Go 里面什么是协程(GMP 模型)?10. 为什么项目要选用 Go 语言?11. JVM 垃圾回收机制讲一下?12. JVM 怎么解决内存碎片问题?13. JVM 在发生复制算法的时候,如果还有引用的对象,这个对象该怎么样去更新到新的地址?14. G1 比 CMS 性能好在哪里?15. Redis 为什么性能这么高,做了哪些优化?16. 你对 AI 智能体、RAG 技术的理解是什么?17. MCP Server 项目是做什么的?准确率如何测评?18. Git merge 和 rebase 区别是什么?为什么说 rebase 危险?19. 开发时多次 commit,如何合并成一个 commit?20. 算法题:模块依赖编译顺序(拓扑排序)🙌面试感想:作为一名后端选手,居然破天荒的约到了前端的面试,我慌的要命,然后赶紧去恶补了一下react相关的知识,不出所料,面试了四十分钟前端的部分基本上被拷打死了,后端的部分全部答出来了也挂了二面,算法题也没刷出来,深刻能感受到这个面试官真的好强啊,前端后端测试还有AI相关的内容全都懂,而且是比较深入的了解,什么时候才能变得这么强?
发面经攒人品
点赞 评论 收藏
分享
前情提要 本人29届毕业,这几天也是春招火热期,于是在boss上投了几个公司。发了几份简历之后,第四范式公司hr初步问我了一些vibe coding的经历,之后打算联系我进行面试。面试内容问:简历中AI Agents的开发经历是个人开发的还是在实习?答:前两个项目是个人开发,后一个是团队开发的(项目:工作流、AI框架、Agent多端应用)问:索要项目上线的网址和在这个Agent多端应用中负责什么方向?答:这个项目的后端是一个golang、python的微服务架构,其中golang负责后端,python负责ai层。前端则是web端为vue3,移动端为flutter。我负责的是全部的的ai层和golang后端的跨域通信和部分后端功能和web前端功能的改进设计。问:询问项目的主要功能,和如何实现?答:使用langchain、langgraph框架,首先把工具通过mcp-adapters进行打包,之后ReActAgent进行调用工具与数据库进行交互,另一方面在进行增删改操作时由于ai输出不一定满足用户的需求,我做了一个独立的确认节点作为拦截中间件,截断了数据的写入,而用户可以来自行编辑或保存删除。问:Agent的工作模式都有什么?答:ToolsCallingAgent、ReActAgent、ReflectionAgent、PlanAndSolveAgent(并粗略展开每一种大概机制,此处不多赘述)问:介绍一下你对RAG的理解?答:我平时不太喜欢用RAG,主要因为两点,自己开发的时候大多数用不到这个技术,RAG最好在垂直领域来使用,尤其是ToB或者专精某一特定领域,而且前段时间不少人说RAG已死,指的是现在很多东西能替代RAG的功能;其次RAG的召回率并不算太高,想要优化召回率只能花费大量人力财力来进行经验微调。知识库开发的流程一般是,先进行数据清洗,之后进行向量化储存到向量数据库,召回时在进行一个向量匹配的操作问: 看到你做了一个memory上下文记忆功能的处理,可以说一下处理逻辑吗?答: 记忆可以分成长期记忆和短期记忆,我在长期记忆这里使用的是RAG技术,将用户强调或者比较有价值的数据存入,这样可以作为一个跨对话窗口的上下文,而短期记忆我也是做了一个上下文压缩,用了一个经验值作为阈值,等上下午到一定程度之后就会进行精炼,而精炼又有两种模式,我分为智能模式和机械模式,智能模式是通过llm进行关键信息等提炼,机械模式是通过正则处理去除冗余的工具调用日志和结构化导致的上下文污染问:对于模型的选型你是否有考虑呢?答:之前自己做过coding agent等类似的项目,在多智能体系统中对于不同的任务采用的模型不同,比如plan使用主力模型opus,编写代码使用中等模型sonnet,而探索项目结构可以使用haiku等小模型,这样的话既可以节省token花销也可以不降低代码质量问:你是否有AI编程的经历和理解?答:略(先是说了市面上各ai编程工具的差异性优点及缺点和我自己的订阅情况,之后说了开发模式相关如spec driven。ps:可参考该文章 AI 原生工程)问:对于Agent有没有什么熔断机制?你有接触过么?比如你的基模直接卡死了,你的后端是否有什么保底机制?答:有的,在项目中我对tool calling做了一个熔断机制如果工具调用失败超过三次就会进行熔断处理,防止反复重试导致系统崩坏。如果基模卡死的话,完全可以弄一个集群来处理,如果一个服务器掉了可以快速转到另一个提供llm的服务器。最终也算是过了
牛客92772631...:buer,夺少届?
查看9道真题和解析
点赞 评论 收藏
分享
评论
点赞
34
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务