计网第五章(运输层)(七)(TCP的连接建立)

news2024/9/25 15:27:03

目录

一、基本概述

二、连接建立

1.基本任务

2.具体实现

 三、经典问题之为什么不用“两次握手”?

一、基本概述

在前面的部分提到过,TCP是基于运输连接来传输TCP报文段。

所以TCP的连接和释放是每次面向连接的通信过程中必不可少的过程。

TCP运输连接分为三个阶段:连接建立、数据传输、释放连接。

二、连接建立

1.基本任务

TCP建立连接主要解决以下问题:

(1)TCP双方能够确知对方的存在。

(2)TCP双方可以协商一些参数(如最大窗口值等)。

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

2.具体实现

如图:主动进行TCP连接建立的应用进程称为TCP客户端(后面简称为客户端),而被动等待TCP连接建立的应用进程称为TCP服务器端(后面简称为服务器端)。连接建立采用“三次握手”的形式,即客户和服务器之间需要交换三个TCP报文段

(1)初始关闭状态:起初两端TCP进程都属于关闭(CLOSED)状态。首先客户和服务器都会创建一个传输控制块。里面就包含了TCP连接表,指向发送和接收缓存的指针等信息。该块在图中不做演示。

(2)服务器进入监听状态:之后,服务器就会进入监听(LISTEN)状态,等待客户的TCP连接建立的请求。很明显这是被动打开。

(3)客户端发送TCP连接请求报文:客户在想要建立TCP连接时,向服务器发送TCP连接请求报文段,并进入同步已发送(SYN-SENT)状态。

TCP连接请求报文段首部的同步位SYN被设置为1,表示这是一个TCP连接请求报文段。序号字段seq被设为x,表示的是客户端所选择的初始序号。很明显这是主动打开。

注意:同步位SYN=1的报文段不允许携带数据,但要消耗掉一个序号。

同步位SYN=1的报文段不一定就是TCP连接请求报文段,TCP连接请求确认报文段的SYN也为1。

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

TCP连接确认报文段首部的同步位SYN和确认位ACK都被设置为1,表示这是一个TCP连接请求确认报文段;序号字段seq被设为y,表示的是服务器端所选择的初始序号;确认号字段ack为x+1,这是对客户端所选择的初始号的确认。

该报文段仍然不能携带数据,但是会消耗掉一个序号,因为它的同步位SYN也为1。

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

该报文段首部中的确认位ACK被设置为1,表示这是一个TCP确认报文段;序号字段取x+1,这是因为客户端在发送第一个报文段(即TCP连接请求报文段)时,该报文段只是消耗了一个序号x,所以发送第二个报文段的序号就从x+1开始(博主还有一种理解就是,之前一直说ack的值表示该序号之前的数据都已被正确接收,该值就表示下一次想要收到的初始的序号,所以第二个报文段的seq的值就是x+1);确认号字段ack为y+1,这是对服务器端所选择的初始号的确认。

注意:这是一个普通的TCP确认报文段,所以它可以携带数据,但是如果不携带数据,它也就不会消耗序号。那么客户端发送下一个报文段的seq的值仍为x+1。

服务器端收到该报文段后就会进入连接已建立状态。然后,双方就可以进行数据传输了。

总结:这里做一个简单的总结 ,对一些博主认为比较细节的东西再次进行说明。

首先就是三报文段中,前两个报文段的序号字段seq的值可以随便取,但是第三个报文段的序号字段seq的值应该是第一个报文段seq的值加1。

第二个就是分清普通确认报文段和TCP连接请求确认报文段。

   普通确认报文段是可以携带数据的,但是TCP连接确认报文段不能携带数据。

   普通确认报文段的首部只需把确认位ACK设为1即可,但是TCP连接请求确认报文段还要把首部中的同步位SYN设为1。

第三个就是注意报文段首部同步位SYN为1的话不能携带数据。但是会消耗掉一个序号。

 三、经典问题之为什么不用“两次握手”?

首先我们需要清楚,如果是两次握手,那么服务器端就不会有进入同步已接收的状态这一过程,当它收到TCP连接请求报文段后,会在向客户端发送TCP连接请求确认报文段之后,进入连接已建立状态。如图:

如图:现在假设客户发送的TCP连接请求报文段在网络中的某处长时间停留了,这必然会引起客户端的超时重传。重传的TCP连接请求被客户端接收,客户端针对该请求发出确认,随后进入连接已建立状态,客户端收到该确认后,也进入连接已建立状态。

现在,双方可以进行数据传输了。

随后双方激情地传输数据,并潇洒地进行四次挥手释放连接,双方都进入了关闭状态。

而此时,最开始的TCP连接请求姗姗来迟。因为服务器端的被动打开的特性,服务器以为是客户端又一次发送了TCP连接请求,于是再次对其确认,并进入连接已建立状态。但实际客户端并没有发送新的TCP连接请求,并且TCP是主动打开,所以对该确认不予理会。

而客户端就一直在傻傻的等待。这样就会浪费掉很多网络资源。

综上所述,三次握手就是为了防止已失效的连接请求报文段突然又传送到了服务器端,从而导致错误。 

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

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

相关文章

Linux设备驱动模型之platform设备

Linux设备驱动模型之platform设备 上一章节介绍了Linux字符设备驱动,它是比较基础的,让大家理解Linux内核的设备驱动是如何注册、使用的。但在工作中,个人认为完全手写一个字符设备驱动的机会比较少,更多的都是基于前人的代码修修…

Vue3+移动端适配屏幕+默认横屏展示

效果图展示区: 1. 想要把px自动转换单位为vw需要项目根目录.postcssrc.js中进行配置以下代码 module.exports {plugins: {autoprefixer: {}, // 用来给不同的浏览器自动添加相应前缀,如-webkit-,-moz-等等"postcss-px-to-viewport": {unitTo…

C/C++计算表达式的值 2023年5月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C计算表达式的值 一、题目要求 1、编程实现 2、输入输出 二、解题思路 1、案例分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 C/C计算表达式的值 2023年5月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 给定整数x,y的值&#xff0c…

视频号挂公众号链接引流到公众号还能加,好消息来了

视频号挂公众号链接要求在八月初出来了新规则,相信玩视频号的人大家都应该清楚,这两个新规则第一个看似简单,但是第二个却堵住了99%的人 接着看看视频号挂链接发展的来龙去脉 要点一:早在前两年,视频号链接直接显示在视…

基于springboot的流沐商城的设计与实现(前后端分离)

博主主页:一季春秋博主简介:专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发,远程调试部署、代码讲解、文档指导、ppt制作等技术指导。主要内容:毕业设计(Java项目、小程序等)、简历模板、学习资料、面试题…

【JavaSE笔记】运算符

一、前言 作为Java编程中最基本的语法元素之一,运算符在编写程序时扮演着至关重要的角色。 运算符被用于执行各种数学和逻辑运算,以及比较操作,运算符的使用可以使代码更加简洁、易读和高效。在本文中,我们将会详细介绍Java中常…

nginx反向代理,用户访问服务器1的80端口,请求转发至服务器2,3的8882端口

两台应用服务器,一台nginx,用户访问nginx服务器80端口,将请求转发至服务器2和服务器3的8882端口。 1、修改nginx配置文件 upstream backend {server 10.60.16.187:8882;server 10.60.16.188:8882;}server {listen 80;server_name 10.6…

Git(9)——Git多人协同开发之创建初始项目

目录 一、简介 二、创建新项目 三、本地Git接入 四、创建远端仓库——Gitee 五、推送代码至远端仓库 一、简介 前面8章都是我们一个人独自开发,如果现在项目新增两名同事,我们就需要使用Git来实现多人协同开发,从第九章开始将介绍从零到…

Atlas VPN 曝零日漏洞,允许查看用户真实 IP 地址

Atlas VPN 已确认存在一个零日漏洞,该漏洞允许网站所有者查看 Linux 用户的真实 IP 地址。不久前,发现该漏洞的人在Reddit上公开发布了有关该零日漏洞的详细信息以及漏洞利用代码。 关于 Atlas VPN 零日漏洞 Atlas VPN提供 "免费 "和付费的 …

GemBox.Bundle 47.0.1227 Crack

GemBox.Document 35.0.1480 GemBox.Email 17.0.1147 GemBox.Imaging 10.0.1096 GemBox.Pdf 17.0.1404 GemBox.Presentation 25.0.1526 GemBox.Spreadsheet 49.0.1454 GemBox.Spreadsheet 从 .NET 应用程序读取、写入、转换和打印 XLSX、XLS、XLSB、CSV、HTML 和 ODS 电子表…

算法题笔记 1-5

目录 week 11. 找出数组中重复的数字题目数据范围样例题解(数组遍历) O(n) 2. 不修改数组找出重复的数字题目数据范围样例题解(分治,抽屉原理) O(nlogn) 3. 二维数组中的查找题目题解(单调性扫描) O(nm) 4.替换空格题目题解(线性扫描) O(n)(双指针扫描) O(n) 5.从尾…

一阶滞后低通滤波器(支持采样频率设置 博途SCL代码)

一阶低通滤波器算法介绍这篇博客不再赘述,专栏有很多的文章讲过。之前的低通滤波器都是没有采样频率接口的,低通滤波器的采样频率都等于定时中断周期,实际滤波效果和信号采样频率、滤波系数、信号采样频率都有关系,所以这里我们将…

【C语言】指针的进阶(二)—— 回调函数的讲解以及qsort函数的使用方式

目录 1、函数指针数组 1.1、函数指针数组是什么? 1.2、函数指针数组的用途:转移表 2、扩展:指向函数指针的数组的指针 3、回调函数 3.1、回调函数介绍 3.2、回调函数的案例:qsort函数 3.2.1、回顾冒泡排序 3.2.1、什么是qso…

Python 10之异常模块包

😀前言 在Python编程中,我们时常会遇到各种异常和错误,同时我们也会使用多个模块和包来组织和结构化我们的代码。理解如何有效地处理异常和组织我们的代码是成为一个成功的Python程序员的关键。 . 在本教程中,我们将深入探讨Pytho…

10.3 滤波电路

整流电路的输出电压虽然是单一方向的,但是含有较大的交流成分,不能适应大多数电子电路及设备的需要。因此,一般在整流后,还需利用滤波电路将脉动的直流电压变为平滑的直流电压。与用于信号处理的滤波电路相比,直流电源…

Friend.tech和Tip Coin爆火!去中心化社交热度再起?

在Web2.0时代,用户对于大型中心化社交平台的信任逐渐降低,于是,去中心化的Web3社交应用也开始如雨后春笋般冒出。其中,像Friend.tech和Tip Coin这样的项目一经推出便在Twitter等平台刷爆了热榜。 Friend.tech基于Coinbase Layer 2…

SAP FI之自动付款程序运行 F110

简介 付款流程包括以下步骤 输入发票分析未结发票的到期日准备应付发票付款被批准或修改发票已付款 始终需要处理大量的发票。 必须按时支付应付帐款发票才能获得可能的折扣。 会计部门希望自动执行此发票处理。 自动付款程序是一种可以帮助用户管理应付帐款的工具。 SAP 为用…

Python 自定义模块

视频版教程 Python3零基础7天入门实战视频教程 Python中已经有很多的内置模块,以及也有很多的第三方优秀模块,我们直接导入使用即可。 当然我们有时候也需要自己定义一些自定义模块,来实现我们项目的功能。 看下案例: 先定义s…

基于Java的大学生在线租房平台的设计与实现(亮点:合理的租房流程、房屋报修、多角色、在线评论回复)

校园点餐小程序 一、前言二、我的优势2.1 自己的网站2.2 自己的小程序(小蔡coding)2.3 有保障的售后2.4 福利 三、开发环境与技术3.1 MySQL数据库3.2 Vue前端技术3.3 Spring Boot框架3.4 微信小程序 四、功能设计4.1 主要功能描述 五、系统实现5.1 前面界…

SpringBoot实战(二十四)集成 LoadBalancer

目录 一、简介1.定义2.取代 Ribbon3.主要特点与功能4.LoadBalancer 和 OpenFeign 的关系 二、使用场景一:Eureka LoadBalancer服务A:loadbalancer-consumer 消费者1.Maven依赖2.application.yml配置3.RestTemplateConfig.java4.DemoController.java 服务…