面试八股 | 计算机网络 | TCP三次握手

news2024/11/30 6:52:31
CP三次握手和四次挥手是面试题的热门考点,它们分别对应TCP的连接和释放过程,今天我们先来认识一下TCP三次握手过程,以及是否可以使用“两报文握手”建立连接。

1、TCP是什么?

TCP是面向连接的协议,它基于运输连接来传送TCP报文段,TCP运输连接的建立和释放,是每一次面向连接的通信中必不可少的过程。

TCP运输连接有以下三个阶段:

  • 建立TCP连接,也就是通过三报文握手来建立TCP连接。
  • 数据传送,也就是基于已建立的TCP连接进行可靠的数据传输。
  • 释放连接,也就是在数据传输结束后,还要通过四报文挥手来释放TCP连接。

2、TCP首部格式

源端口: 占16比特,写入源端口号,用来标识发送该TCP报文段的应用进程。

目的端口: 占16比特,写入目的端口号,用来标识接收该TCP报文段的应用进程。

序号: 占32比特,取值范围[0, 2^32-1],序号增加到最后一个后,下一个序号就又回到0。指出本TCP报文段数据载荷的第一个字节的序号

确认号: 占32比特,取值范围[0,2^32-1],确认号增加到最后一个后,下一个确认号就又回到0。指出期望收到对方下一个TCP报文段的数据载荷的第一个字节的序号,同时也是对之前收到的所有数据的确认。若确认号=n,则表明到序号n-1为止的所有数据都已正确接收,期望接收序号为n的数据。

确认标志位ACK: 取值为1时确认号字段才有效;取值为0时确认号字段无效。TCP规定,在连接建立后所有传送的TCP报文段都必须把ACK置1。

数据偏移: 占4比特,并以4字节为单位。用来指出TCP报文段的数据载荷部分的起始处距离TCP报文段的起始处有多远。这个字段实际上是指出了TCP报文段的首部长度。

窗口: 占16比特,以字节为单位。指出发送本报文段的一方的接收窗。

同步标志位SYN: 在TCP连接建立时用来同步序号。终止标志位FIN: 用来释放TCP连接。

复位标志位RST: 用来复位TCP连接。

推送标志位PSH: 接收方的TCP收到该标志位为1的报文段会尽快上交应用进程,而不必等到接收缓存都填满后再向上交付。

校验和: 占16比特,检查范围包括TCP报文段的首部和数据载荷两部分。在计算校验和时,要在TCP报文段的前面加上12字节的伪首部。

紧急指针: 占16比特,以字节为单位,用来指明紧急数据的长度。

填充: 由于选项的长度可变,因此使用填充来确保报文段首部能被4整除,(因为数据偏移字段,也就是首部长度字段,是以4字节为单位的)。

3、TCP的连接建立

TCP 建立连接的过程叫做握手,握手需要在客户和服务器之间交换三个TCP 报文段,称之为三报文握手,采用三报文握手主要是为了防止已失效的连接请求报文段突然又传送到了,因而产生错误。

TCP的连接建立要解决以下三个问题:

1、使TCP双方能够确知对方的存在 。

2、使TCP双方能够协商一些参数( 最大窗口值是否使用窗口扩大选项和时间戳选项,以及服务质量等)。

3、使TCP双方能够对运输实体资源(例如缓存大小连接表中的项目等)进行分配。

4、三次握手图文详解

如图所示,这是两台要基于TCP进行通信的主机:

  • 主动发起TCP连接建立称为TCP客户(client)。
  • 被动等待TCP连接建立的应用进程称为TCP服务器(server)。

我们可以将TCP建立连接的过程比喻为”握手“,“握手”需要在TCP客户端和服务器之间交换三个TCP报文段。

最初两端的TCP进程都处于关闭(CLOSED)状态:

一开始,TCP服务器进程首先创建传输控制块,用来存储TCP连接中的一些重要信息。例如TCP连接表、指向发送和接收缓存的指针、指向重传队列的指针,当前的发送和接收序号等。

之后就准备接受TCP客户进程的连接请求, 此时TCP服务器进程就要进入监听(LISTEN)状态等待TCP客户进程的连接请求。TCP服务器进程是被动等待来自TCP客户端进程的连接请求,因此称为被动打开连接。

TCP客户进程也是首先创建传输控制块,然后再打算建立TCP连接时向TCP服务器进程发送TCP连接请求报文段,并进入同步已发送(SYN-SENT)状态。

TCP连接请求报文段:

  • 该报文段首部中的同步位SYN被设置为1,,表明这是一个tcp连接请求报文段。
  • 序号字段seq被设置了一个初始值x作为TCP客户进程所选择的初始序号。

请注意: TCP规定SYN被设置为1的报文段不能携带数据但要消耗掉一个序号。由于TCP连接建立是由TCP客户进程主动发起的,因此称为主动打开连接。

TCP服务器进程收到TCP连接请求报文段后,如果同意建立连接,则向TCP客户进程发送TCP连接请求确认报文段,并进入同步已接收(SYN-RCVD)状态。

TCP连接请求确认报文段:

  • 该报文段首部中的同步位SYN和确认位ACK 都设置为1,表明这是一个TCP连接请求。
  • 序号字段seq被设置了一个初始值y,作为TCP服务器进程所选择的初始序号。
  • 确认号字段ack的值被设置成了x+1,这是对TCP客户进程所选择的初始序号seq的确认。

请注意:这个报文段也不能携带数据,因为它是SYN被设置为1的报文段,但同样要消耗掉一个序号。

TCP客户进程收到TCP连接请求确认报文段后,还要向TCP服务器进程发送一个普通的TCP 确认报文段并进入连接已建立(ESTABLISHED)状态。

TCP 确认报文段:

  • 该报文段首部中的确认位ACK被设置为1,表明这是一个普通的TCP确认报文段 。
  • 序号字段seq 被设置为x+1,这是因为TCP客户进程发送的第一个TCP报文段的序号为x,并且不携带数据,因此第二个报文段的序号为x +1。
  • 确认号字段ack被设置为y + 1,这是对TCP服务器进程所选择的初始序号的确认。

请注意:TCP规定普通的TCP确认报文段可以携带数据,但如果不携带数据则不消耗序号,在这种情况下所发送的下一个数据报文段的序号仍是x + 1。

TCP服务器进程收到该确认报文段后也进入连接已建立(ESTABLISHED) 状态,现在TCP双方都进入了连接已建立状态,他们可以基于已建立好的TCP连接进行可靠的数据传输了。

5、三次握手总结

三次握手是 TCP 连接的建立过程。在握手之前,主动打开连接的客户端结束 CLOSE 阶段,被动打开的服务器也结束 CLOSE 阶段,并进入 LISTEN 阶段。随后进入三次握手阶段:

① 首先客户端向服务器发送一个 SYN 包,并等待服务器确认,其中:

  • 标志位为 SYN,表示请求建立连接;
  • 序号为 Seq = x(x 一般取随机数);
  • 随后客户端进入 SYN-SENT 阶段。

② 服务器接收到客户端发来的 SYN 包后,对该包进行确认后结束 LISTEN 阶段,并返回一段 TCP 报文,其中:

  • 标志位为 SYN 和 ACK,表示确认客户端的报文 Seq 序号有效,服务器能正常接收客户端发送的数据,并同意创建新连接;
  • 序号为 Seq = y;
  • 确认号为 Ack = x + 1,表示收到客户端的序号 Seq 并将其值加 1 作为自己确认号 Ack 的值,随后服务器端进入 SYN-RECV 阶段。

③ 客户端接收到发送的 SYN + ACK 包后,明确了从客户端到服务器的数据传输是正常的,从而结束 SYN-SENT 阶段。并返回最后一段报文。其中:

  • 标志位为 ACK,表示确认收到服务器端同意连接的信号;
  • 序号为 Seq = x + 1,表示收到服务器端的确认号 Ack,并将其值作为自己的序号值;
  • 确认号为 Ack= y + 1,表示收到服务器端序号 seq,并将其值加 1 作为自己的确认号 Ack 的值。
  • 随后客户端进入 ESTABLISHED。

当服务器端收到来自客户端确认收到服务器数据的报文后,得知从服务器到客户端的数据传输是正常的,从而结束 SYN-RECV 阶段,进入 ESTABLISHED 阶段,从而完成三次握手。

5、是否可以使用“两报文握手”建立连接?

为什么TCP客户进程最后还要发送一个普通的TCP确认报文段?

考虑这样一种情况,TCP客户进程发出一个TCP连接请求报文段,但该报文段在某些网络节点长时间滞留了,这必然会造成该报文段的超时重传。假设重传的报文段被TCP服务器进程正常接收,TCP服务器进程给TCP客户进程发送一个TCP连接请求确认报文段,并进入连接已建立状态。

请注意: 由于我们改为两报文握手,因此TCP服务器进程发送完TCP连接请求确认报文段后,进入的是连接已建立状态,而不像三报文握手那样进入同步已接收状态,TCP服务器进程并等待TCP客户进程发来针对TCP连接请求确认报文段的普通确认报文段。

TCP客户进程收到TCP连接请求确认报文段后进入TCP连接已建立状态,但不会给TCP服务器进程发送针对该报文段的普通确认报文段。

现在,TCP双方都处于连接已建立状态,他们可以相互传输数据,之后可以通过四报文挥手来释放连接,TCP双方都进入了关闭状态。

一段时间后,之前滞留在网络中的那个失效的TCP连接请求报文段到达了TCP服务器进程,TCP 服务器进程会误认为这是TCP客户进程又发起了一个新的TCP连接请求,于是给TCP客户进程发送TCP连接请求确认报文段并进入连接已建立状态。该报文段到达TCP客户进程,由于TCP客户进程并没有发起新的TCP连接请求,并且处于关闭状态,因此不会理会该报文段。

但TCP服务器进程已进入了连接已建立状态,他认为新的TCP连接已建立好了,并一直等待TCP客户进程发来数据。这将白白浪费TCP服务器进程所在主机的很多资源。

综上所述,采用三报文握手,而不是两报文握手来建立TCP连接,是为了防止已失效的连接请求报文段突然又传送到了TCP服务器进程因而导致错误。

6、两报文握手总结

三次握手的主要目的是确认自己和对方的发送和接收都是正常的,从而保证了双方能够进行可靠通信。若采用两次握手,当第二次握手后就建立连接的话,此时客户端知道服务器能够正常接收到自己发送的数据,而服务器并不知道客户端是否能够收到自己发送的数据。

我们知道网络往往是非理想状态的(存在丢包和延迟),当客户端发起创建连接的请求时,如果服务器直接创建了这个连接并返回包含 SYN、ACK 和 Seq 等内容的数据包给客户端,这个数据包因为网络传输的原因丢失了,丢失之后客户端就一直接收不到返回的数据包。

由于客户端可能设置了一个超时时间,一段时间后就关闭了连接建立的请求,再重新发起新的请求,而服务器端是不知道的,如果没有第三次握手告诉服务器客户端能否收到服务器传输的数据的话,服务器端的端口就会一直开着,等到客户端因超时重新发出请求时,服务器就会重新开启一个端口连接。长此以往, 这样的端口越来越多,就会造成服务器开销的浪费。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【附源码】计算机毕业设计JAVA养老机构系统

【附源码】计算机毕业设计JAVA养老机构系统 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JAVA mybati…

国际物流和跨境电商物流的区别

跨境物流是将货物通过海、陆、空运输从一个国家运输到另一个国家或地区,最终完成交易的目的。国际物流是实现两地对物资进行物理移动的一项国际商品交易或交流活动,从而完成国际商品交易的终目的。二者说法不同而已,本质上两者并没有太大的区…

APAUNet

Title:APAUNet: Axis Projection Attention UNet for Small Target in 3D Medical Segmentation 摘要: 在医学分割中,小目标分割对于诊断至关重要。在本文提出了轴向投影注意力网络,用于三维医学图像分割,特别是小目标。考虑到背…

什么是PCB中的光学定位点,不加可不可以?

什么是PCB中的光学定位点,不加可不可以? 这个问题在我平时的教学答疑出现的频次非常高,很多新手在初次接触这个概念的时候往往分不清楚这个光学定位点作用什么?从而导致他根本不知道什么时候该加,什么时候不加。 今天我…

物流通知:您的快递即刻送达!

“双11”购物狂欢节刚刚过去 “双12”马上就要到啦! 回想双11期间 隔日达、次日达的快递 让买买买的快乐直接翻倍 也大大提升了消费者们 双12的再消费欲望 飞奔的物流背后有什么秘密武器? 来跟着小翼一探究竟! 物流行业的飞速发展给…

Android App开发之利用JNI实现加密和解密操作实战(附源码 简单易懂)

运行有问题或需要源码请点赞关注收藏后评论区留言~~~ 一、JNI实现加密和解密 在实际开发中 JNI主要应用于以下场景 1:对关键业务数据进行加密和解密 Java代码容易遭到破解,JNI加密更加安全 2:底层的网络操作与设备操作 Java作为一门高级…

智慧农业建设方案中的物联网技术

物联网即“物物相联之网”,指通过射频识别(RFID)、红外感应器、全球定位系统、激光扫描器等信息传感设备,按约定的协议,把物与物,人与物进行智能化连接,进行信息交换和通讯,以实现智能化识别、定…

一分钟给大量视频褪色并加马赛克

剪辑视频的时候,想给大量的视频进行褪色处理,并且添加马赛克,可以用什么简单的操作方法吗?今天小编就来给大家安利一个可以快速批量这样进行操作的方法,下面就来看看具体的操作吧! 首先大家在浏览器搜索下载…

【VTK+有限元后处理】节点属性值查询

功能 有限元在后处理过程中,我们如果想获取某一个节点的属性数据值,最直接的方法就是点击这个节点,然后显示其属性数据。 代码实现 首先我们需要使用到VTK的点拾取类vtkPointPicker类。 从需求可知,我们需要与窗口进行交互&am…

STM32开发_利用SPI协议读写SD卡、介绍SD卡SPI时序

一、​ SD卡引脚接口功能介绍 1.1 SD卡引脚 目录 一、​ SD卡引脚接口功能介绍 1.1 SD卡引脚接口图 1.2 SPI方式驱动SD卡介绍 1.3 开发板接口定义 二、MMC卡、SD卡介绍 2.1 SD卡和MMC两者间区别 2.2 SD卡版本说明 2.3 SD卡常用的指令表 三、向SD卡发送命令的步骤介…

【数据结构】堆的拓展延伸 —— 堆排序 和 TopK问题

文章目录前言堆排序TopK问题结语前言 上篇博客,我们实现了堆。那么堆到底有什么应用情景?今天的内容就是堆的两个应用,堆排序和TopK问题。话不多说,我们这就开始。 堆排序 堆排序,是根据堆的结构而设计出的一种排序…

Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks

原文链接:https://aclanthology.org/D19-1410.pdf 概述 问题: BERT和RoBERT模型在进行语义匹配的时候,需要将每个可能的组合都输入到模型中,会带来大量的计算(因为BERT模型对于句子对的输入,使用[SEP]来标记…

C++11、17、20的内存管理-指针、智能指针和内存池从基础到实战(中)

C11、17、20的内存管理-指针、智能指针和内存池从基础到实战(中)第三章 分配器allocator和new重载1、重载operator的new和delete包括数组如果我们访问的是一个数组2、类成员操作符new重载和放置placement_newplacement new(放置内存&#xff…

并发编程(三)原子性(1)

【认识原子性】: 一个小程序认识原子性: package T05_YuanZiXing;import java.util.concurrent.CountDownLatch; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;public class T00_00_IPlusPlus {private …

Android源码相关面试专题

Android源码相关面试专题 1、Android属性动画实现原理 工作原理:在一定时间间隔内,通过不断对值进行改变,并不断将该值赋给对象的属性,从而实现该对象在该属性上的动画效果。 正在上传…重新上传取消 1)ValueAnimato…

Do Transformers Really Perform Bad for Graph Representation?

Do Transformers Really Perform Bad for Graph Representation? 论文中提出了Graphormer,它建立在标准的Transformer架构之上,并且在广泛地图表示学习任务重获得了优异的成绩。同时,作者也提出了一些简单但是有效的结构编码方法来帮助Grap…

【支付宝生态质量验收与检测技术】

如何验收和检测海量的支付宝生态小程序的质量,是一个很重要的课题。本次分享会简单介绍如何通过平台化的方式在小程序入驻环节进行准入验收,以及使用前端自动化测试技术和智能化算法对小程序质量进行检测。希望能对小程序质量的验收和测试提供参考。讲师…

计算机网络-应用层(应用层概述,网络应用模型(C/S模型,P2P模型),DNS域名协议)

文章目录1. 应用层概述2. 网络应用模型3. 域名系统(DNS)1. 应用层概述 应用层概述:应用层对应用程序的通信提供服务。 应用层协议定义: 应用进程交换的报文类型,请求还是响应各种报文类型的语法,如报文中…

分布式锁-简单入门

状态不是很好,记一下以前学过的分布式锁吧。 样例简介 不谈大概念,就是简单入门以及使用。 为什么要用分布式锁呢? 假设我需要一个定时操作,每天在某个点,我要处理一批数据,要先从数据库中查询出来&…

云计算-Hadoop-2.7.7 最小化集群的搭建(3台)

云计算-Hadoop-2.7.7 最小化集群的搭建(3台) 文章目录云计算-Hadoop-2.7.7 最小化集群的搭建(3台)一、环境依赖下载二、部署概要三、hadoop101模板机配置1. 更新 & 升级2. 安装好用的vim VimForCpp3. 安装必要依赖4. 关闭防火…