TCP协议建立连接的过程及其意义

目录

三次握手

四次挥手

三次握手的意义


  在客户端与服务器传输数据之前,要在两台主机之间先建立连接,然后再传输业务数据。三次握手,就是建立连接的过程,是在传输业务之前,就要先进行。握手好了,才能进行后续的传输。注意:握手只是发送一个不携带业务数据的数据报,不起到任何业务的作用,只是用来“打个招呼”。

三次握手

  建立连接,就是通信双方,各自保存对端的信息。具体完成上述过程,需要经过三次网络交互。三次握手的第一次一定是客户端先发起的。谁先发起,谁就是客户端。如果是“服务器”先发起,它就不应该叫服务器了,而应该叫“客户端”。具体流程如下:

SYN称为同步报文,即一端向另一端主动发送数据时的报文。即把TCP报头中的SYN位置为1,就表示此报文为同步报文。

ACK称为应答报文,表示接收端收到发送过来的报文,再给发送端一个回答。即把TCP报头中的ACK位置置为1。

具体流程就是:客户端先向服务器发送一个SYN,服务器接收到了,就给客户端返回一个ACK,表示收到SYN(客户端向服务器通信是可以的),然后也会向客户端发送一个SYN,用来确定服务器向客户端通信是否成功,客户端如果收到SYN,也会返回一个ACK,告诉服务器,双方通信都是可以的。

注意,中间的两次交互ACK和SYN是可以合并成一个网络数据的。

所谓的合并,就是让这一个TCP数据报,报头中,同时把这两个bit位都置为1

这样就提高了传输的效率。

三次握手的时候,相当于双方各自让对方保存自己的信息,必须两边都把对方的信息保存好,连接才算是建立完成。

四次挥手

  四次挥手就是断开TCP连接的过程,四次挥手整个过程结束之后,TCP连接才会断开。

注:三次握手,一定是客户端先发起第一次请求。而四次挥手则是客户端和服务器都可以主动发起。我们此处以客户端主动提出为例。具体流程如下:

和三次握手的过程基本一致。断开连接,就是通信双方把之前保存对方的信息删除。

四次挥手中间两次能否合并?   常规情况下不能,特殊情况下可以。

这是因为三次握手过程中,SYN和ACK都是内核自动控制发送的。(发送时机是内核控制的,同一时机)服务器收到SYN后,立即返回ACK,也立即返回SYN,同时进行,就可以合并。

而四次挥手过程中,收到FIN后,ACK立即返回,但是FIN并不会立即返回,FIN返回的时机是应用程序代码中调用close方法的时候,才会触发的。

由于两个数据报触发的时机不同,因此就难以合并。

在特殊情况下,TCP触发延时应答机制的时候(要等待一段时间再返回ACK),两个数据报是可以合并的。

三次握手的意义

1)三次握手,相当于“投石问路”,在正式传输业务数据之前,先确认一下通信链路是否通畅。(也相当于TCP可靠传输的一种确认方式,但是只是辅助。核心还是确认应答和超时重传机制)

2)通过三次握手,来确认通信双方,发送能力和接收能力都是正常的。进行三次握手,本质上就是完成上述确认的过程。

3)三次握手的过程中,还需要协商一些必要的参数。有的参数,不是单方面就能确认的,需要双方共同来确定出来。

比如,TCP通信时使用的序号,就是协商出来的。第一次连接和第二次连接,协商出来的起始序号,往往差异很大。

在传输数据的过程中,某个数据报,网络通信的过程中,迷路了(不是丢包)。过了很久才到达服务器,而这个时候,之前的连接已经断开,现在是一个新的连接。服务器收到这样的数据之后,会直接丢弃。

那么如何区分这个数据报是不是上一次连接的数据报?通过序号就可以区分出来。

TCP要避免出现“前朝的剑,斩本朝的官”。每次建立的连接,都是一个新的数字,作为起始序号的。当前本朝的数据,序号一定是沿着我们起始序号往下的数字(不会相差很多)。如果突然收到了一个数据报,序号和当前的起始序号差别非常大,就可以认为这是前朝的数据报了。

一个经典面试题:TCP为啥要要三次握手?/两次行不行?四次行不行?

两次:不行,服务器这边对于通信双方的发送能力和接收能力的验证还没完成。

四次:行。但是没必要。拆开中间的这次交互,虽然不影响tcp的正常功能,但是性能会有损失。

以上,关于TCP,希望对你有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/700481.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JS面试题】this

this取什么值,是在函数执行的时候确定的,不是在函数定义的时候确定的! this的6种使用场景: ① 在普通函数中使用:返回window对象 ② 使用call apply bind 调用:绑定的是哪个对象就返回哪个对象 ③ 在对象…

【C++】priority_queues(优先级队列)和反向迭代器适配器的实现

目录 一、 priority_queue1.priority_queue的介绍2.priority_queue的使用2.1、接口使用说明2.2、优先级队列的使用样例 3.priority_queue的底层实现3.1、库里面关于priority_queue的定义3.2、仿函数1.什么是仿函数?2.仿函数样例 3.3、实现优先级队列1. 1.0版本的实现…

过滤器Filter和拦截器Interceptor实现登录校验

一.过滤器 Filter过滤器可以把对资源的请求拦截下来,从而实现一些登录验证的功能 1.Filter的快速入门 1.定义Filter:定义一个类,实现Filter接口,并重写其所有方法。2.配置 public class dofilter implements Filter {Override //初始化只…

手撸XXL-JOB(三)——本地定时任务管理平台

引言 在XXL-JOB中,有一个xxl-job-admin项目,这个就相当于定时任务的调度平台,我们参考XXL-JOB,也添加这么一个调度平台,由于篇幅有限,我们先实现一个本地的定时任务调度平台,至于如何调用远程的…

(2024,MambaOut,Mamba 适合长序列,区分指标,不适合分类,适合检测和分割)视觉真的需要 Mamba 吗?

MambaOut: Do We Really Need Mamba for Vision? 公和众和号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 目录 0. 摘要 1. 简介 3. 概念讨论 3.1 Mamba 适合哪些任务? 3.2 视觉识别任…

接口测试基础

1、接口测试 接口:系统之间数据交互的通道。 硬件接口软件接口 接口测试:基于不同的输入参数,校验接口响应数据与预期数据是否一致。 接口地址 接口参数 2. 为什么要学接口测试? 提前介入测试、尽早发现问题 3、接口测试学什…

十二生肖Midjourney绘画大挑战:释放你的创意火花

随着AI艺术逐渐进入大众视野,使用Midjourney绘制十二生肖不仅能够激发我们的想象力,还能让我们与传统文化进行一场新式的对话。在这里,我们会逐一提供给你创意满满的绘画提示词,让你的作品别具一格。而且,我们还精选了…

2024年金属非金属矿山(露天矿山)安全管理人员证考试题库及金属非金属矿山(露天矿山)安全管理人员试题解析

题库来源:安全生产模拟考试一点通公众号小程序 2024年金属非金属矿山(露天矿山)安全管理人员证考试题库及金属非金属矿山(露天矿山)安全管理人员试题解析是安全生产模拟考试一点通结合(安监局)…

【C++】每日一题 17 电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 可以使用回溯法来解决这个问题。首先定义一个映射关系将数字与字母对应起来…

嵌入式Linux:编译和使用Protobuf库

目录 1、开发环境和工具 2、安装和编译Protobuf、Protobuf-C库 3、编写和编译proto文件 4、修改makefile文件 5、测试示例 6、参考资料 Protobuf(Protocol Buffers)是由 Google 开发的一种轻量级、高效的结构化数据序列化方式,用于在不同应用…

内联函数+auto关键字(C++11)+指针空指针nullptr(C++11)

内联函数auto关键字(C11)指针空指针nullptr(C11)详解 内联函数概念特性 auto关键字(C11)auto简介auto的使用细则auto不能推导的场景 基于范围的for循环(C11)范围for的语法范围for的使用条件 指针空指针null…

算法-卡尔曼滤波之卡尔曼滤波的第二个方程:预测方程(状态外推方程)

在上一节中,使用了静态模型,我们推导出了卡尔曼滤波的状态更新方程,但是在实际情况下,系统都是动态,预测阶段,前后时刻的状态是改变的,此时我们引入预测方程,也叫状态外推方程&#…