引言

在前面的内容中,我们已经详细讲解了一系列与TCP相关的面试问题。然而,这些问题都是基于个别知识点进行扩展的。今天,我们将重点讨论一些场景问题,并探讨如何解决这些问题。

序列号确认问题

当A主机与B主机建立了TCP连接后,A主机发送了两个TCP报文,分别大小为500和300字节。第一个报文的序列号为200。那么当B主机接收到这两个报文后,返回的确认号应该是多少呢?

当A主机发送第一个TCP报文时,序列号为200,大小为500。因此,A主机发送的数据范围是200-699(包括200和699)。

当A主机发送第二个TCP报文时,序列号为700,大小为300。因此,A主机发送的数据范围是700-999(包括700和999)。

当B主机接收到这两个报文后,确认号应该是下一个预期的序列号。根据TCP的规则,下一个预期的序列号应该是接收到的最后一个字节的序列号加上1。

所以,B主机接收到的最后一个字节的序列号是999,因此,返回的确认号应该是1000。

为什么增加的是tcp包的大小而不是单纯+1呢?为什么增加的是TCP包的大小而不是简单地加1呢?在TCP协议中,确认号是基于接收到的数据字节数来计算的,而不是简单地加1。

当B主机接收到A主机发送的第一个500字节的TCP报文时,B主机期望下一个字节的序列号是200 + 500 = 700。由于TCP是面向字节的传输协议,每个字节都有一个唯一的序列号,因此确认号是基于已接收字节的累积值。所以,B主机返回的确认号是700。

接着,当B主机接收到A主机发送的第二个300字节的TCP报文时,B主机期望下一个字节的序列号是700 + 300 = 1000。因此,B主机返回的确认号是1000。

如何确定上层协议?

收到一个IP数据包后,操作系统中的网络协议栈会进行解析。在解析过程中,有一个关键步骤是确定该数据包应该投递到上层的哪个协议(UDP或TCP)。

为了更好地理解这个过程,我们先来看一下分层协议结构示意图:

可以看到,在包装完TCP头信息之后,才会包装IP头信息。因此,在IP头部中应该能够得知当前是什么协议的数据包。接下来,我们来具体查看一下IP头信息的示意图:

在IP协议中,协议字段用于区分上层协议。在Linux系统的/etc/protocols文件中定义了所有上层协议对应的协议字段。例如,ICMP的协议字段为1,TCP的协议字段为6,UDP的协议字段为17。

我们知道TCP和UDP是服务器传输数据的常用协议。而ICMP则是用于传输网络传输过程中的一些中间链路的错误信息反馈。正如之前提到的,路由器等网络设备属于三层协议,它们可以判定并修改IP头部中的信息。

因此,通过对IP头部中的协议字段进行解析,操作系统可以确定接收到的数据包应该传递给哪个上层协议进行处理。

应用程序应该如何提供他们自己的记录标识?

TCP提供了一种字节流服务,其中发送方和接收方都不维护记录的边界。这意味着在传输过程中,数据可能会被分割成多个TCP段,而接收方需要确定每个段属于哪个应用程序的记录。应⽤程序应该如何提供他们自己的记录标识呢?

为了实现这一点,应用程序可以使用一些方法来提供自己的记录标识。以下是一些常用的方法:

  • 使用特定的协议头或标识符:应用程序可以在发送的数据中添加特定的协议头或标识符,以便接收方能够识别和组合相关的数据段。例如,在Redis的通信协议(RESP协议)中,每个命令或数据都以特定的控制字符"\r\n"作为结束符,这样接收方就能够根据这些结束符来识别和组合记录。
  • 使用固定长度的数据块:应用程序可以将数据划分为固定长度的数据块,并在每个数据块前添加标识信息。接收方可以根据这些标识信息来组合和还原应用程序的记录。
  • 使用消息边界标记:应用程序可以在数据中使用特定的消息边界标记,例如特殊字符或预定的控制序列。接收方根据这些边界标记来确定每个记录的边界。

通过使用这些方法,应用程序可以在数据传输过程中进行分段和还原,从而实现记录的完整性和可靠性。这些方法能够提供自定义的记录标识,使得数据能够准确地组合和还原为应用程序的记录。

TCP 和 UDP 的区别

TCP(传输控制协议)和UDP(用户数据报协议)是两种常见的互联网传输协议,它们在网络通信中有以下几个主要的区别:

  • 连接性:TCP是面向连接的协议,它在通信前需要建立一个可靠的连接,然后再进行数据传输。而UDP是无连接的协议,它不需要建立连接就可以直接发送数据。
  • 可靠性:TCP提供可靠的数据传输,它使用确认机制、重传机制、流量控制、拥塞控制和序列号等技术来确保数据的完整性和有序性。UDP则不提供可靠性保证,它只是简单地将数据包发送出去,并不关心是否能够到达目标。
  • 速度:由于TCP提供了可靠性保证和流量控制等机制,因此它的传输速度相对较慢。而UDP没有这些额外的机制,所以传输速度比TCP快。
  • 占用资源:TCP需要维护连接状态和缓存等信息,因此占用的系统资源较多。而UDP不需要维护连接状态,所以占用的系统资源较少。
  • 适用场景:由于TCP提供了可靠性保证,所以在需要确保数据完整性和有序性的场景下使用较多,如文件传输、网页浏览等。而UDP适用于实时性要求较高的场景,如视频和音频流媒体、在线游戏等。

总结

通过本文的讲解,我们了解了一些关于TCP的场景问题及其解决方法。我们学习了如何确定TCP报文的应答号,通过解析IP头部的协议字段来确定数据包的上层协议,以及应用程序如何提供自己的记录标识。此外,我们还比较了TCP和UDP的区别,包括连接性、可靠性、速度、资源占用和适用场景等方面。通过深入理解这些问题,我们可以更好地应对TCP相关的面试和实际应用场景。

🔥🔥你真的知道TCP协议中的序列号确认、上层协议及记录标识问题吗?的更多相关文章

  1. TCP协议中的序列号

    TCP 协议工作在OSI的传输层,是一种可靠的面向连接的数据流协议,TCP之所以可靠,是因为它保证了传送数据包的顺序.顺序是用一个序列号来保证的.响应包内也包括一个序列号,表示接收方准备好这个序列号的 ...

  2. TCP传输中序号与确认序号的交互

    本实验通过SSH远程登录server,然后使用Wireshark抓包分析. 开头的三次握手已经省略.关于序号的交互过程.须要记住一点:TCP首部中的确认序号表示已成功收到字节,但还不包括确认序号所指的 ...

  3. TCP协议可靠性是如何保证之滑动窗口,超时重发,序列号确认应答信号

    原创文章首发于公众号:「码农富哥」,欢迎收藏和关注,如转载请注明出处! TCP 是一种提供可靠性交付的协议. 也就是说,通过 TCP 连接传输的数据,无差错.不丢失.不重复.并且按序到达. 但是在网络 ...

  4. TCP 协议中MSS的理解

    在介绍MSS之前我们必须要理解下面的几个重要的概念.MTU: Maxitum Transmission Unit 最大传输单元MSS: Maxitum Segment Size 最大分段大小PPPoE ...

  5. tcp协议中mss的理解

    在介绍MSS之前我们必须要理解下面的几个重要的概念.<blockquote>MTU: Maxitum Transmission Unit 最大传输单元MSS: Maxitum Segmen ...

  6. IC卡的传输协议(1)-字符传输协议T=0【转】

    转自:http://bbs.ednchina.com/BLOG_ARTICLE_172022.HTM 在异步半双工传输协议中,主要定义了终端为实现传输控制和特殊需要发出的命令及这些命令的处理过程. 在 ...

  7. [转]使用wireshark分析TCP/IP协议中TCP包头的格式

    本文简单介绍了TCP面向连接理论知识,详细讲述了TCP报文各个字段含义,并从Wireshark俘获分组中选取TCP连接建立相关报文段进行分析. 一.概述 TCP是面向连接的可靠传输协议,两个进程互发数 ...

  8. 【转】TCP/IP协议中TCP和UDP的区别

    TCP协议与UDP协议的区别    首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚网络通信! ...

  9. 从TCP三次握手说起–浅析TCP协议中的疑难杂症(2)

    版权声明:本文由黄日成原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/108 来源:腾云阁 https://www.qclo ...

  10. 从TCP三次握手说起--浅析TCP协议中的疑难杂症(1)

    版权声明:本文由黄日成原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/73 来源:腾云阁 https://www.qclou ...

随机推荐

  1. ABP 的ajax请求错误:400 Empty or invalid anti forgery header token.

    ABP 的ajax请求错误 记录于2018-03-22 13:31:16 星期四 错误信息:400 Empty or invalid anti forgery header token. 我从网上找到 ...

  2. golang channel 未关闭导致的内存泄漏

    现象 某一个周末我们的服务 oom了,一个比较重要的job 没有跑完,需要重跑,以为是偶然,重跑成功,因为是周末没有去定位原因 又一个工作日,它又oom了,重跑成功,持续观察,job 在oom之前竟然 ...

  3. Go命令

    build: 编译包和依赖 clean: 移除对象文件 doc: 显示包或者符号的文档 env: 打印go的环境信息 bug: 启动错误报告 fix: 运行go tool fix fmt: 运行gof ...

  4. linux 配置dns及代理

    简介 对于新装的环境,可能无法访问外网,此时需要设置代理或DNS实现访问. 类似wget.yum.pip这类命令都需要通过网络进行下载. 配置dns服务 在/etc/resolv.conf中添加如下两 ...

  5. 清理MySQL的binlog历史文件

    前言 系统版本:centos 7 MySQL版本:5.7 mysql的binlog文件最好不要手动删,避免删错导致bin log同步异常. 步骤 查看当前的binlog文件 show binary l ...

  6. Java不能操作内存?Unsafe了解一下

    前言 C++可以动态的分类内存(但是得主动释放内存,避免内存泄漏),而java并不能这样,java的内存分配和垃圾回收统一由JVM管理,是不是java就不能操作内存呢?当然有其他办法可以操作内存,接下 ...

  7. 用 GPT-4 给开源项目 GoPool 重构测试代码 - 每天5分钟玩转 GPT 编程系列(8)

    目录 1. 好险,差点被喷 2. 重构测试代码 2.1 引入 Ginkgo 测试框架 2.2 尝试改造旧的测试用例 2.3 重构功能测试代码 3. 总结 1. 好险,差点被喷 早几天发了一篇文章:&l ...

  8. Web攻防--JS算法逆向--断点调试--反调试&&代码混淆绕过

    Web攻防--JS算法逆向--断点调试--反调试&&代码混淆绕过 JS算法逆向 在进行渗透测试过程中,在一些功能点进行参数注入或者枚举爆破等过程中,会出现参数进行加密的情况,但是我们输 ...

  9. PDF 补丁丁 1.0 正式版

    经过了一年多的测试和完善,PDF 补丁丁发布第一个开放源代码的正式版本了. PDF 补丁丁也是国内首先开放源代码.带有修改和阅读PDF的功能的 PDF 处理程序之一. 源代码网址:https://gi ...

  10. gitlab与LDAP 联调

    gitlab整理 目录 gitlab整理 1.安装Gitlab依赖包 2.下载,安装 3.配置,访问域名及邮箱 4.初始化,启动 5.访问,以及邮箱测试 5.1汉化 6.问题总结处理 6.1安装时出现 ...