网络协议详解:TCP Part1

2023-11-08

目录

TCP的可靠性

TCP的机制

ack

编号机制

1.发送的数据编号(SN)

2.确认的数据编号(ASN)

3.编号规则

4.SN在发送TCP Segment 的 Header 中如何体现

5.ASN的填写规则

6.ISN 

TCP segment扮演角色

 开关在header中的体现

重传机制

1.没有收到数据,所以没应答

2.收到数据,也应答了,但还没有传回来

3.数据在何时选择重发 

4.重发失败处理 

TCP缓冲区 

发送缓冲区

接收缓冲区 

TCP连接

连接管理

握手的认识

同步信息

握手过程

 syn标志位及携带数据问题

 三次握手

 三次握手过程中的状态转移


TCP的可靠性

TCP的可靠性是通过以下这几点实现的:

1.TCP会尽量把数据发送给对方,但不保证100%

2.TCP的数据如果发送不成功,会给发送端应用层错误通知,这个时候应用层就知道数据丢失了

3.TCP可以保证接收方的应用层严格按照发送时的数据顺序接收

4.TCP保证数据不会无意损坏(UDP也可以)

5.TCP尽可能地在维护网络质量

TCP的机制

ack

ack代表确认信息,当对方收到信息后,便会将ack发送回发送端,这个时候就直到数据成功传过去了。

编号机制

当我们发送数据时,发的肯定是某一段数据,这个时候只需要把需要传递的数据的序列号开头传过去就可以。

1.发送的数据编号(SN)

SN 也就是发送的数据编号开头

2.确认的数据编号(ASN)

ASN 确认的数据编号,这个信息一般由接收方二次发送回来,代表着发送端的下次开头编号,便于下次发送端发送数据。

3.编号规则

一般不从0开始,因为太容易被坏人劫持,太好猜

一般我们的payload都是byte[]数组,所以我们基本一个字节占用一个编号

4.SN在发送TCP Segment 的 Header 中如何体现

TCP 发送和接收的完整数据内容一般称为Segment(段),也就是header和payload的总和

我们一次会发送多个数据,又因为byte[]数组的连续性,所以我们SN直接填写本次发送数据的第一个字节的数据编号即可。

在Header中,我们会保存payload中第一个字节的数据(SN编号),这样编号就变得可用了,在我们发送的时候,发送这个字节数据即可,segent会承担payload的长度

5.ASN的填写规则

1.在header中,就是32位确认序号那一栏

2.ASN表示要接收的下一个字节的数据,把它传回给发送端,发送端就知道发什么了

6.ISN 

 ISN指数据的第一个字节编号,一般不会从0开始,这是处于安全角度考虑,以防恶意用户推测出合法的SN值来加以利用。

TCP segment扮演角色

segement就是上图的完整内容合并,它不仅可以担任send的角色,当我们标志位开关被打开时,也具有acknowledge segment的功能。

 开关在header中的体现

header中是含有标志位的,每个标志位我们就想象成一个开关,开关打开,就具备了响应功能

重传机制

重传分为以下两种情况

1.没有收到数据,所以没应答

1.有可能是数据还在路上

2.有可能数据已经丢失了

2.收到数据,也应答了,但还没有传回来

1.有可能还在路上

2.丢失

我们可以通过设定合理超时时间,解决在路上的问题,我们可以多等一会儿,再不来,那就只可能是丢失了。

3.数据在何时选择重发 

无论是数据已经丢包,还是数据正在半路,只要超时没有收到ack,我们都可以选择无脑重发数据

4.重发失败处理 

当尝试几次重发后还是收不到ack,我们就停止发送。这里TCP已经用自己最大努力了

接下来,可以这样操作:

1.通知应用层,发送失败(一般在write()中就会抛出异常)

2.尽自己最大努力再尝试联系一下(reset segment) :最后的尝试,没收到也就没收到了

TCP缓冲区 

发送缓冲区

TCP是有发送缓冲区的,因为我也不知道能不能发送成功,所以需要暂时保留数据,以防万一

一旦数据放到本机的TCP发送缓冲区,就证明算是发送成功了

接收缓冲区 

TCP同样有接收缓冲区,用法和UDP一个意思

TCP连接

连接是抽象概念,说白了就是两台主机的相互连接,可以进行信息交互

连接管理

当我们连接起来,有这么几个阶段:

握手(连接建立) -> 使用 -> 挥手(连接断开)

握手的认识

同步信息

握手是一个双方信息互相同步的过程

握手过程

一般发送方先发送同步请求,由接收方接收后,再放回来发送同步请求和ack,这样,双方就连接起来并且可以互通数据了

 syn标志位及携带数据问题

同样在header标志位中,打开开关,即可同步

当我们第一次建立同步时,是不可以携带数据的,因为不知道能不能连接上

 虽然不携带数据,但syn同样会消耗序列号

 三次握手

上述中描述我们可以看出,两端之间有三次的互通过程,之后可以正常使用,这个就叫做三次握手

 三次握手过程中的状态转移

我觉得老师的总结已经很到位了

就是当我发送端发syn的时候起,接收方就会被打开,然后进行我们的三次握手过程就完事了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

网络协议详解:TCP Part1 的相关文章

  • Web Api - 不允许捕获 405 方法

    截至目前 Web api 应用程序针对 405 方法不允许错误返回以下响应正文 我正在尝试更改响应正文 但我不知道如何使用委托处理程序 ApiControllerActionSelector 或过滤器 谁能帮我捕获服务器端的 405 错误
  • 在 Tomcat 上部署 Java Web 项目,无需 WAR 或 EAR

    我有一个 Java Web 项目 Struts Spring 在我的本地主机上完美运行 我必须将其部署在我的网站上 但虚拟主机提供的 Tomcat Manager 界面显示 由于安全原因 它无法上传 WAR 文件 当联系技术支持时 我被告知
  • VSTS 构建失败/发布无法在 bin 文件夹中找到 roslyn\csc.exe

    我们有一个网站项目 安装了以下 nuget 软件包 Microsoft CodeDom Providers DotNetCompilerPlatform 1 0 8 Microsoft Net Compilers 2 4 0 The web
  • Firebase Auth - 最近登录多长时间

    我有一个个人资料选项卡 用户可以在其中按编辑并编辑他们的个人资料 我只想在必要时才需要他们的密码 所以想知道用户登录的时间是多少毫秒 这使得它不是最近登录 其中firebase会抛出错误 auth requires recent login
  • Chrome:网络元素自动移动

    我正在开发一个网络项目 在过去的两周里 我正在进行学期考试 所以我要休息一下 现在 既然他们已经结束了 我又继续我的工作了 但我发现我的一些Web 元素 如按钮 span 在 Chrome 上移动了一些像素 在 IE 和 Mozilla 上
  • 如何从文件系统访问 api window.showDirectoryPicker() 获取选定的目录路径

    当我选择一个文件夹时 我确实得到了 dirHandle 但无法弄清楚什么属性或方法将为我提供完整路径 const dirHandle await window showDirectoryPicker 所以类似 let path dirHan
  • 如何从Web JavaScript应用程序获取桌面C#程序中的变量

    我遇到一个问题 有两个应用程序 一种是 C 中的桌面应用程序 另一种是 javascript 中的 Web 应用程序 运行桌面应用程序中的一些变量或信息需要传输到Web应用程序 有谁知道如何解决这个问题 有人愿意提供更多细节来解决这个问题吗
  • Tornado websocket handler , self.close() 正在关闭连接而不触发 on_close() 方法

    我是 python stackoverflow tornado 的新手 所以请耐心等待 纠正我 我正在使用龙卷风开发实时应用程序 当我在 Websocket 处理程序类中调用 self close 时 on close 方法不会启动 这次我
  • 如何在 PHP Soap 客户端中禁用命名空间别名?

    我的 PHP Microsoft AX 集成有问题 我正在使用 SOAP WSDL 与服务集成 我遇到的问题是在从 PHP 向 WSDL 发送请求后收到此错误 无效的实例类型名称 ns3 AxdEntity DirParty DirOrga
  • 如何从网页中提取文本内容? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在用java开发一个应用程序 它
  • 向下滚动时如何使图像移动?

    这是我想要实现的目标的示例 https www flambette com en https www flambette com en 我尝试过更改图像的 css 属性 但效果不能满足我的需求 我尝试过以下代码 mydocument on
  • GWT 的 RPC 与 AJAX 不同吗?

    与 AJAX 调用相比 GWT Google Web Toolkit 的 RPC 远程过程调用 用于从浏览器 javascript 到服务器的异步操作有何不同或相似 如果它们不同 有人可以帮助我理解它们有何不同吗 我还听说这个 RPC 实现
  • 如何使我的网站兼容移动设备和平板电脑? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想让我现有的网站在手机 平板电脑上查看时自动调整 甚至在您在桌面上调整屏幕时自动调整 如果失败的话 如果太难 你有什么建议 我基本上
  • 是否可以下载网站的完整代码、HTML、CSS 和 JavaScript 文件? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 是否可以完全下载网站或查看其所有代码 例如 我知道您可以在浏览器中查看页面源代码 但是有没有办法下载所有网站代码 例如 HTML CSS
  • 如何在Delphi中下载一个非常简单的HTTPS页面?

    我尝试了在这里看到的代码 但它不适用于 HTTPS 我需要将此页面作为字符串下载 并在其上添加一些换行符 以便将信息按顺序放入 TMemo 中 怎么做 我尝试使用 Indy 但由于 SSL 问题而失败 我尝试了此页面的解决方案 如何将网页下
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 在网站的一次导航中仅显示一次弹出窗口

    我有一个使用 Laravel 创建的网站 我希望用户第一次访问我的网站时能够看到弹出窗口 我的意思是第一次 用户访问我网站上的任何页面 这是第一次 访问网站上的一些链接页面 现在 这些页面访问不是第一次 在同一选项卡中打开 facebook
  • 如何对基于 HTML5-JavaScript 的视频播放器进行快照?

    实际上 我有一个带有 JavaScript 函数的 HTML5 页面 可以让我播放 wmv 视频文件 我需要在视频播放时 有暂停或没有暂停 拍摄快照并以任何图像格式 JPG 或 BMP 保存 任何帮助将不胜感激 谢谢
  • 获取url,给定的url重定向到

    我从 rss 链接中挖掘数据并获得一堆网址 例如 http feedproxy google com r electricpig 3 qoF8XbocUbE http feedproxy google com r electricpig 3
  • 可靠的在线手册复制工具

    我经常需要在没有互联网的情况下开发项目 不幸的是 越来越多的程序不再有离线手册 在本地复制在线帮助的最佳方法是什么 HTTrack 网站复制器经常失败 哪个 Windows 工具最可靠 感谢你的建议 如果您有使用 HTTrack Websi

随机推荐

  • 【计算机视觉笔记】图像检索学习 (Content Based Image Retrieval)

    论文跟踪 Awesome image retrieval papers https github com willard yuan awesome cbir papers 综述 SIFT Meets CNN A Decade Survey
  • 白嫖 GitHub Pages,轻松搭建个人博客

    Hexo 是一个快速 简单且功能强大的博客框架 使用 Markdown 解析文档 Hexo 能在几秒内生成带有自定义主题并集成各项功能的网站页面 本文采用 Github Pages Hexo 的方式 搭建个人博客 零 准备工作 1 使用个人
  • QT通过parentWidget()实现多界面跳转及关闭(切换界面和返回前一界面)

    QT通过parentWidget 实现多界面跳转及关闭 切换界面和返回前一界面 不需要跳转界面相互包含头文件 超简单的方法 先将第一级的窗口this指针传给次级的的窗口 子窗口通过parentWidget 返回第一级的this并用来调用sh
  • (五)复函数积分的定义与性质

    本文内容主要如下 1 复积分的概念 1 1 复积分的定义 1 2 复积分的存在性与计算 1 3 一个圆周上的重要积分公式 1 4 复积分的基本性质 1 复积分的概念 1 1 复积分的定义 定义 如图 C为平面上一条光滑的简单曲线 z z
  • k8s集群pod直接无法ping通

    简介 基于OpenStack云主机搭建的k8s集群 网络CNI选用的calico 使用的是BGP模式 pod直接无法ping通 宿主机也无法ping通pod 排除后发现不是安全组的原因 应该是OpenStack的网卡默认会丢掉非本网卡ip地
  • WSL2-解决无法ping通主机/配置使用主机代理

    WSL2无法ping通主机 省流 如果主机能ping通wsl从机 从机ping不通主机 大概率是防火墙拦截了 可以以管理员身份在powershell中运行下面的代码 或者手动在防火墙设置中添加相应的出入站规则 New NetFirewall
  • 音频-基于Core Audio技术采集音频(版本1)

    这个是第一次版本优化 优化是简单易懂 代码 WindowsAudioSession cpp 基本的利用WAS采集音频的demo include
  • extern关键字作用

    语法 extern放在变量和函数声明之前 表示该变量或者函数在别的文件中已经定义 提示编译器在编译时要从别的文件中寻找 除此之外 extern还可以用来进行链接指定 作用 声明外部变量 在声明全局变量时 不同的文件在编译器编译时是不透明的
  • 字节流与字符流

    流是个抽象的概念 是对输入输出设备的抽象 输入流可以看作一个输入通道 输出流可以看作一个输出通道 输入流是相对程序而言的 外部传入数据给程序需要借助输入流 输出流是相对程序而言的 程序把数据传输到外部需要借助输出流 字节流 传输过程中 传输
  • java基础系列 -- 类的三大特性:封装、继承、多态

    java类的特性 类有三大特性 封装 继承 多态 封装 封装就是将类的某些属性隐藏起来 限制在类的外部对类内部成员进行访问 通过接口对外开放 但是在外部不能直接进行查找属性 只通过公共接口来访问类的成员数据 为什么要设置隐藏 隐藏数据是为了
  • jpa.hibernate.ddl-auto属性说明

    jpa hibernate ddl auto 的几个常用属性值 none 默认值 什么都不做 每次启动项目 不会对数据库进行任何验证和操作 create 每次运行项目 没有表会新建表 如果表内有数据会被清空 create drop 每次程序
  • nginx_http_proxy,upstream,stream模块简析

    一 ngx http proxy module模块 模块功能 为后端httpd服务做反向代理 并且与Httpd 之间使用http进行通信 1 proxy pass URL Context location if in location li
  • 如何求C语言字符串长度(strlen函数和sizeof关键字)

    如何求C语言字符串长度 strlen函数和sizeof关键字 在程序里 一般会用 strlen 函数或 sizeof 来获取一个字符串的长度 但这2种方法获取的字符串的长度其实是不一样 我们用如下函数进行测试 void test6 char
  • Java8新特性-Lambda表达式

    Lambda表达式 也可称为闭包 它是推动Java8发布的最重要的特性 Lambda允许把函数作为一个方法的参数 函数作为参数传递进入方法中去 使用lambda表达式可以把代码变得更加简洁紧凑 语法 lambda表达式的语法格式如下 par
  • Ciclop开源3D扫描仪软件---Horus源码分析之point_cloud_roi.py

    联系方式 QQ 2468851091 call 18163325140 Email 2468851091 qq com coding utf 8
  • C语言小游戏——井字棋(数组实现)

    学c也学了有一些时间了 今天用c语言做了一个小游戏 井字棋 相信大家也玩过 我们这个游戏的思路呢 是玩家和电脑对弈 谁先把三颗棋子连成一条线 谁就赢了 如下图所示 要想实现我们这个井字棋需要用到数组的知识 所以 老规矩我们先简单的把数组讲一
  • SCI审稿流程(转)

    1 收到邮件 编辑约审稿 同意就接受 会约定审稿期限 一般三个月 Dear Mr Cat Please be informed you have been registered by our editorial team as a user
  • scheduler学习率设置

    在炼丹的过程中 学习率的调整是必不可少的 下面给出scheduler模块的调学习率的方法 后面会慢慢补充 调整学习率 PyTorch官方文档 一 CyclicLR torch optim lr scheduler CyclicLR opti
  • php把二维数组变为一维,如何将PHP二维数组转换为一维数组

    如何将PHP二维数组转换为一维数组 发布时间 2020 07 22 11 12 05 来源 亿速云 阅读 137 作者 Leah 如何将PHP二维数组转换为一维数组 相信很多没有经验的人对此束手无策 为此本文总结了问题出现的原因和解决方法
  • 网络协议详解:TCP Part1

    目录 TCP的可靠性 TCP的机制 ack 编号机制 1 发送的数据编号 SN 2 确认的数据编号 ASN 3 编号规则 4 SN在发送TCP Segment 的 Header 中如何体现 5 ASN的填写规则 6 ISN TCP segm