TCP连接延伸7小问

2024-01-12 14:08
文章标签 连接 tcp 延伸 小问

本文主要是介绍TCP连接延伸7小问,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.TCP三次握手和四次挥手

三次握手(Three-way Handshake)主要作用就是为了确认双方的接收能力和发送能力正常。其实就是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小信息,为后面的可靠性传送做准备。
刚开始客户端处于 Closed 的状态,服务端处于 Listen 状态。
在这里插入图片描述
在这里插入图片描述

Q1:为什么两次握手不可以?(A客户端,B服务器)

为了防止已经失效的连接请求报文段突然又传送到了 B,因而产生错误。比如:A 发出的第一个连接请求报文段在网路结点上延误到之后的连接释放以后的某个时间段才到达 B。 B 收到此失效的请求报文段后,就误认为 A 又发出一次新的连接请求。如果不进行第三次握手,B 发出确认后就进入了新的运输连接状态,一直等待 A 发来数据。

Q2:接收端收到 客户端的 SYN 后,为什么还要传回 SYN?

接收端传回发送端所发送的 SYN 是告诉客户端接收到的信息确实是客户端所发送的信号了。
SYN 是 TCP / IP 建立连接时使用的握手信号。在客户机和服务器之间建立正常的 TCP 网络连接时,客户机首先发出一个

Q3:传了 SYN,为什么还要传 ACK?

传了 SYN,证明发送方到接收方的通道没有问题,但是接收方到发送方的通道还需要 ACK 信号来进行验证。

Q4:为什么 TIME-WAIT 状态必须等待 2MSL 的时间呢?(MSL:最长报文段寿命)

TCP释放连接时为什么time_wait状态必须等待2MSL时间
1.如果 接收端A 在 TIME-WAIT 状态不等待一段时间,那么就无法收到 B 重传的 FIN + ACK 报文段,因而也不会再发送一次确认报文段,这样,B 就无法按照正常步骤进入 CLOSED 状态。
2. 防止已失效的连接请求报文段出现在本连接中。A 在发送完最后一个 ACK 报文段后,再经过时间 2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。下一个连接中不会出现旧的连接请求报文段。

Q5:为什么第二次跟第三次不能合并, 第二次和第三次之间的等待是什么?

当服务器执行第二次挥手之后, 客户端不会再向服务端请求任何数据, 但是服务端可能还正在给客户端发送数上一次请求的资源,所以服务端会等到把之前未传输完的数据传输完毕之后再发送关闭请求。

Q6:TCP 协议是如何保证可靠传输的?
  1. 数据包校验:检测数据在传输过程中若出错,则丢弃报文段并且不给响应, TCP 发送数据端超时后会重发数据;
  2. 对失序数据包重排序:既然 IP 数据报的到达可能会失序,TCP 报文段作为 IP 数据报来传输,到达也可能会失序。TCP 将失序重排,然后才交给应用层;
  3. 能够丢弃重复数据;
  4. 应答机制:收到发自 TCP 连接另一端的数据,将发送一个确认标志ACK。
  5. 超时重发:当 TCP 发出一个段后,就会启动一个定时器,设定时间内没有收到ACK将重发这个报文段;
  6. 流量控制:TCP 连接的双方都有固定大小的缓冲空间。不允许对方发送超过自己缓冲区容量的数据,以防较快主机致使较慢主机的缓冲区溢出。TCP 使用的流量控制协议是可变大小的滑动窗口协议。
Q7:Tcp握手成功后,如果一方宕机,没有主动请求关闭,连接会一直保存么?

当TCP连接发生一些物理上的意外情况时,例如网线断开,linux上的TCP实现会依然认为该连接有效,而windows则会在一定时间后返回错误信息。可以通过设置SO_KEEPALIVE选项来解决,不过不知道这个选项是否对于所有平台都有效。
连接断开过程-----四次挥手

这篇关于TCP连接延伸7小问的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Mac电脑如何通过 IntelliJ IDEA 远程连接 MySQL

《Mac电脑如何通过IntelliJIDEA远程连接MySQL》本文详解Mac通过IntelliJIDEA远程连接MySQL的步骤,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友跟... 目录MAC电脑通过 IntelliJ IDEA 远程连接 mysql 的详细教程一、前缀条件确认二、打开 ID

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

python连接sqlite3简单用法完整例子

《python连接sqlite3简单用法完整例子》SQLite3是一个内置的Python模块,可以通过Python的标准库轻松地使用,无需进行额外安装和配置,:本文主要介绍python连接sqli... 目录1. 连接到数据库2. 创建游标对象3. 创建表4. 插入数据5. 查询数据6. 更新数据7. 删除

在 Spring Boot 中连接 MySQL 数据库的详细步骤

《在SpringBoot中连接MySQL数据库的详细步骤》本文介绍了SpringBoot连接MySQL数据库的流程,添加依赖、配置连接信息、创建实体类与仓库接口,通过自动配置实现数据库操作,... 目录一、添加依赖二、配置数据库连接三、创建实体类四、创建仓库接口五、创建服务类六、创建控制器七、运行应用程序八

Linux之UDP和TCP报头管理方式

《Linux之UDP和TCP报头管理方式》文章系统讲解了传输层协议UDP与TCP的核心区别:UDP无连接、不可靠,适合实时传输(如视频),通过端口号标识应用;TCP有连接、可靠,通过确认应答、序号、窗... 目录一、关于端口号1.1 端口号的理解1.2 端口号范围的划分1.3 认识知名端口号1.4 一个进程

解决hive启动时java.net.ConnectException:拒绝连接的问题

《解决hive启动时java.net.ConnectException:拒绝连接的问题》Hadoop集群连接被拒,需检查集群是否启动、关闭防火墙/SELinux、确认安全模式退出,若问题仍存,查看日志... 目录错误发生原因解决方式1.关闭防火墙2.关闭selinux3.启动集群4.检查集群是否正常启动5.

在Linux系统上连接GitHub的方法步骤(适用2025年)

《在Linux系统上连接GitHub的方法步骤(适用2025年)》在2025年,使用Linux系统连接GitHub的推荐方式是通过SSH(SecureShell)协议进行身份验证,这种方式不仅安全,还... 目录步骤一:检查并安装 Git步骤二:生成 SSH 密钥步骤三:将 SSH 公钥添加到 github

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys