趣谈(思考)TCP建接时三次握手和断连时四次握手

2024-06-12 23:38

本文主要是介绍趣谈(思考)TCP建接时三次握手和断连时四次握手,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       了解TCP的你们应该知道,TCP 协议是基于连接的(UDP不是面向连接的),先建立好连接,然后再进行传输。建立连接时是3次握手,断开连接是四次握手,一起学习:

三次握手建连-客户端发起:
       Server 端先监听端口,此时Server的连接状态是 LISTEN 状态。

       这时 Client 端准备建立连接,向Server端发送一个 SYN 同步包,Client 端的连接状态为 SYN_SENT 状态。

       Server 端收到 SYN 后,同意建立连接,会向 Client 端回复一个 ACK和SYN,然后Server 端的连接状态变成了 SYN_RCVD。

       Client 收到 Server 的 ACK 后,连接状态变成了 ESTABLISHED 状态,同时Client 向 Server 端发送 ACK,回复 Server 端的 SYN 请求。

       Server 端收到 Client 端的 ACK 后,Server 端的连接状态也变成了的 ESTABLISHED 状态,建连完毕。

 四次挥手断连-双方都可以发起:  

       假设是Client端发起,Client 向 Server 发送了一个 FIN 包,然后 Client 进入了 FIN_WAIT_1 状态。

       Server 端收到 FIN 后,返回 ACK,然后进入 CLOSE_WAIT 状态。

       Server 端会向 Client 端发送 FIN,此时 Server 进入 LAST_ACK 状态。

       Client 端收到 Server 端的 FIN 后,回复 ACK,然后进入 TIME_WAIT 状态,之后才会进入 CLOSED 关闭状态。

       而 Server 端收到 ACK 后直接进入 CLOSED 状态。

       其实这个过程我想大多数人应该都听说过,只是好像容易忘记,因为要理解,而不是死记硬背,只有理解了才会记得牢,我感觉三次握手建连就像你要给别人发什么东西的准备,应该是这么个过程:

你:在不在,我给你发个东西(SYN),收到回下。这相当于Client 向Server端发送一个 SYN 同步包。

他:噢,知道了(ACK)。一直在阿,可以发(SYN),发来嘛,收到回下。这相当于Server端同意建立连接,向 Client 端回复一个 ACK和SYN。

你:噢,在是吧,知道了(ACK),那我准备发了。这相当于Client 向 Server 端发送 ACK,回复 Server 端的 SYN 请求。

       然后双方就开始处理了。每一次确认都不可少,你想如果是2次握手,那可能一方没有确认对方消息,4次握手也显多余,因为是建立连接,Server 端的 SYN 和 ACK就合并为一次发送了,告知对方准备就绪,没必要分两次发送。

       四次握手断连就像说,东西发完了我要撤了,应该是这么个过程:

你:东西基本发完了(FIN)我要撤了,收到回下。这相当于Client 向 Server 发送了一个 FIN 包。

他:噢,好。收到(ACK)。这相当于Server收到 FIN 后,返回 ACK。

可能他要等一会。。。

他:嗯,是都发完了(FIN),那我也要撤了,收到回下。这相当于Server 向 Client 端发送 FIN。

可能你要等一会。。。

你:噢,好,收到(ACK)。我再等一会就撤,你先撤吧。这相当于Client端向Server端回复 ACK。

       四次确认,为什么不是三次,因为断连时两个方向上数据发送停止数据包(FIN)的时间可能不同,所以不能合并发送 FIN 和 ACK,必须都确认,我感觉这在生活中也有例子,打电话时接通了就行,挂电话要问下:说完没?他说说完了。你说:那我也说完了。拜拜。

       UDP传输可能是这样(图摘自网络):

 

这篇关于趣谈(思考)TCP建接时三次握手和断连时四次握手的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1055666

相关文章

QT实现TCP客户端自动连接

《QT实现TCP客户端自动连接》这篇文章主要为大家详细介绍了QT中一个TCP客户端自动连接的测试模型,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录版本 1:没有取消按钮 测试效果测试代码版本 2:有取消按钮测试效果测试代码版本 1:没有取消按钮 测试效果缺陷:无法手动停

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

2024.9.8 TCP/IP协议学习笔记

1.所谓的层就是数据交换的深度,电脑点对点就是单层,物理层,加上集线器还是物理层,加上交换机就变成链路层了,有地址表,路由器就到了第三层网络层,每个端口都有一个mac地址 2.A 给 C 发数据包,怎么知道是否要通过路由器转发呢?答案:子网 3.将源 IP 与目的 IP 分别同这个子网掩码进行与运算****,相等则是在一个子网,不相等就是在不同子网 4.A 如何知道,哪个设备是路由器?答案:在 A

图解TCP三次握手|深度解析|为什么是三次

写在前面 这篇文章我们来讲解析 TCP三次握手。 TCP 报文段 传输控制块TCB:存储了每一个连接中的一些重要信息。比如TCP连接表,指向发送和接收缓冲的指针,指向重传队列的指针,当前的发送和接收序列等等。 我们再来看一下TCP报文段的组成结构 TCP 三次握手 过程 假设有一台客户端,B有一台服务器。最初两端的TCP进程都是处于CLOSED关闭状态,客户端A打开链接,服务器端

网络原理之TCP协议(万字详解!!!)

目录 前言 TCP协议段格式 TCP协议相关特性 1.确认应答 2.超时重传 3.连接管理(三次握手、四次挥手) 三次握手(建立TCP连接) 四次挥手(断开连接)  4.滑动窗口 5.流量控制 6.拥塞控制 7.延迟应答 8.捎带应答  9.基于字节流 10.异常情况的处理 小结  前言 在前面,我们已经讲解了有关UDP协议的相关知识,但是在传输层,还有

linux下TCP/IP实现简单聊天程序

可以在同一台电脑上运行,在一个终端上运行服务器端,在一个终端上运行客户端。 服务器端的IP地址要和本地的IP相同,并分配端口号,客户端的默认设置为本地,端口号自动分配。 服务器端: #include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <sys/types.

JAVAEE初阶第七节(中)——物理原理与TCP_IP

系列文章目录 JAVAEE初阶第七节(中)——物理原理与TCP_IP 文章目录 系列文章目录JAVAEE初阶第七节(中)——物理原理与TCP_IP 一.应用层重点协议)1. DNS2 .NAT3. NAT IP转换过程 4 .NAPT5. NAT技术的缺陷6. HTTP/HTTPS7. 自定义协议 二. 传输层重点协议 1 .UDP协议 2.1.1 UDP协议端格式 2.1.2 UD

深入理解TCP通信

这大概是自己博客上面第三次写TCP通信demo了,总是写同样的内容也不太好啊,不过每一次都比前一次进步一点。这次主要使用了VIM编辑工具、gdb调试、wireshirk、netstat查看网络状态。 参考《C++服务器视频教程》、《Unix网络编程》 一、VIM常用命令 vim server.cpp #打开一个文件:w 写入文件:wq 保存并退出:q! 不保存退出显示行号

【编程底层思考】详解Java的JUC多线程并发编程底层组件AQS的作用及原理

Java中的AbstractQueuedSynchronizer(简称AQS)是位于java.util.concurrent.locks包中的一个核心组件,用于构建锁和其他同步器。AQS为实现依赖于FIFO(先进先出)等待队列的阻塞锁和相关同步器提供了一套高效、可扩展的框架。 一、AQS的作用 统一同步状态管理:AQS提供了一个int类型的成员变量state,用于表示同步状态。子类可以根据自己