关于CS144的小总结

文章目录

  • 字节流
  • 接收方需要完成的工作
    • 处理数据
    • 封装头部
  • 发送方需要完成的工作
    • 发送数据
    • 处理收到的报文段头部
      • 发送但未确认队列处理
      • 超时重传处理
  • 为什么需要三次握手
    • 流程
    • 角度1:确认连接双方能力
    • 角度2:避免半连接
  • 为什么需要4次挥手
    • 流程
    • 4次挥手的目的
      • 为什么4次挥手就能满足以上目的

字节流

接收方需要完成的工作

处理数据

  1. 交付:使用字节流的方式将数据交付上层,主要是lab1的实现内容,使用map维护乱序的碎片字符串来模拟数据接收缓冲区。
  2. seqno处理:接收到对方的报文中,获取其32b的seqno,解封装为64b的字节流中的index,以拼接到正确的位置

封装头部

  1. ackno计算:根据已经写入的64b字节流数量,封装为32b的ackno作为头部数据
  2. win计算:根据现在缓冲区的剩余长度作为win,封装为头部数据

发送方需要完成的工作

发送方主要有5种状态:

  1. CLOSED
  2. SYN_SENT
  3. SYN_ACKED
  4. FIN_SENT
  5. FIN_ACKED

第2、4、5种情况不需要再发送数据,第1种情况需要发送SYN报文,第3种情况需要从应用层取数据封装并发送

发送数据

  1. 从应用层取尽可能多的数据封装报文,不能超过报文最大长度和接收窗口大小
  2. 判断是否已经到达字节流结尾,决定是否发送FIN报文
  3. 将数据发送并存放到发送但未确认的队列中

处理收到的报文段头部

发送但未确认队列处理

TCP是累计确认,若ackno是新的,则将发送但未确认队列中的报文段末尾比ackno更早的都弹出,表示均已确认。

超时重传处理

  1. 若冗余ACK超过阈值或超时,则重传最早的发送未确认报文
  2. 若为冗余ACK,则进行冗余ACK计数;否则重启计数器,并重置超时时间为初始时间
  3. 若计数器超时,则超时时间加倍

为什么需要三次握手

流程

三次握手流程如下,将发起连接的称为客户端,被连接方称为服务端。

  1. 客户端发送SYN报文,SYN位置1,且有ISN初始号作为序列号SEQ1。
  2. 服务端发送SYN_ACK报文,SYN和ACK位均置1,且有ISN初始号作为序列号SEQ2,ACKNO为SEQ1 + 1
  3. 客户端发送ACK报文,ACK位置1,且ACKNO为SEQ2 + 1

角度1:确认连接双方能力

参考链接
目的:双方均确认双方具有发送能力和接收能力。

  1. 客户端发送SYN报文并被服务端接收:此时服务端确认客户端有发送能力,服务端有接收能力。
  2. 服务端发送SYN_ACK报文并被客户端接收:自己发送的SYN报文被收到,确认自己发送能力和服务端的接收能力;能收到服务端的SYN_ACK报文,确认自己的接收能力和服务端的发送能力。因此第2次握手结束时,客户端就确认4个能力均具备了。
  3. 客户端发送ACK报文并被服务端接收:客户端收到了SYN_ACK报文,确认客户端具有接收能力和自己的发送能力。

第三次握手原因:如果没有第3次握手,则服务端无法确认本身的发送能力和客户端的接收能力。可能客户端根本无法接收。若在此时建立连接,则会造成资源浪费,发送报文也无法得到回应。

角度2:避免半连接

参考链接
TCP报文中均携带了确认号,若客户端因为网络拥塞,SYN报文很长时间才到达服务端,则客户端会超时重传SYN报文。然后客户端和服务端愉快地进行TCP之后结束连接。
而在结束后,客户端重发的SYN报文才到达,如果是2次握手,则服务端也会痛快地决定建立连接,给客户端发送信息,等待客户端的信息等等,浪费自身和网络资源。

为什么需要4次挥手

流程

四次握手流程如下:假设数据先发送完毕的是客户端

  1. 客户端数据发送完毕,发送FIN报文
  2. 服务端针对1的FIN发送ACK报文
  3. 服务端数据发送完毕,发送FIN报文,此报文携带2报文中的ACK确认号
  4. 客户端针对2的FIN发送ACK报文

注意点:服务端收到ACK后可立即关闭连接,而服务端在发送完ACK后不能立即关闭连接,需要等待一段时间后,未再收到服务端的报文,才能关闭连接。

4次挥手的目的

目的:

每个TCP实体都既作为发送方,也作为接收方
a. 作为发送方:确认【对方已收到所有报文】
b. 作为接收方:确认【对方确认[自己已收到所有报文]】

为什么4次挥手就能满足以上目的

作为晚结束的那一方(如以上流程中的服务端),在收到4后就满足a,并满足了b,为什么呢?因为3报文中也携带着对客户端FIN报文的ACK确认号,当服务端收到了4报文,则服务端确认客户端收到了3报文,则满足b。

作为早结束的那一方(如以上流程中的客户端),收到2的ACK就满足a,在设定时间内未收到服务端反馈则认为满足了b,为什么呢?若服务端未收到4报文,则会超时重传,要求客户端重新发送4报文;若服务端收到4报文则直接关闭连接。客户端在足够长的时间未收到服务端的超时重传报文,则认为服务端已关闭连接,即客户端是通过服务端连接已关闭来满足b条件的

我认为这个小结是4次握手的本质原因,洞察4次挥手的目的

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

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

相关文章

【C语言每日一题】10. 超级玛丽游戏

题目来源:http://noi.openjudge.cn/ch0101/10/ 10 超级玛丽游戏 总时间限制: 1000ms 内存限制: 65536kB 问题描述 超级玛丽是一个非常经典的游戏。请你用字符画的形式输出超级玛丽中的一个场景。 输入 无。 输出 如样例所示。 样例输入 (无&…

Kotlin管道Channel在receiveAsFlow时debounce与flow差异

Kotlin管道Channel在receiveAsFlow时debounce与flow差异 import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.delay import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import kotlinx.coroutine…

kafka学习-概念与简单实战

目录 1、核心概念 消息和批次 Topic和Partition Replicas Offset broker和集群 生产者和消费者 2、开发实战 2.1、消息发送 介绍 代码实现 2.2、消息消费 介绍 代码实现 2.3、SpringBoot Kafka pom application.yaml KafkaConfig producer consumer 1、核心…

【Spring MVC】统一功能处理

一、登录验证 登录验证通过拦截器实现,拦截器就是在用户访问服务器时,预先拦截检查一下用户的访问请求。 没有拦截器时,用户访问服务器的流程是:用户–>controller–>service–>Mapper。有拦截器时,用户访问…

RouterOS-配置PPPoEv4v6 Server

1 接口 ether3 出接口 ether4 内网接口 2 出接口 出接口采用PPPoE拨号SLAAC获取前缀,手动配置后缀 2.1 选择出接口interface,配置PPPoE client模式 2.2 配置PPPoE client用户名和密码 2.3 从PPPoE client获取前缀地址池 2.4 给出接口选择前缀并配置…

第10章_索引优化与查询优化(覆盖索引, 索引下推等)

4. 子查询优化 MySQL 从 4.1 版本开始支持子查询,使用子查询可以进行 SELECT 语句的嵌套查询,即一个 SELECT 查询的结果作为另一个SELECT 语句的条件。 子查询可以一次性完成很多逻辑上需要多个步骤才能完成的 SQL 操作 。 子查询是 MySQL 的一项重…

Vue + Element UI 前端篇(七):功能组件封装

组件封装 为了避免组件代码的臃肿&#xff0c;这里对主要的功能部件进行封装&#xff0c;保证代码的模块化和简洁度。 组件结构 组件封装重构后&#xff0c;试图组件结构如下图所示 代码一览 Home组件被简化&#xff0c;包含导航、头部和主内容三个组件。 Home.vue <te…

Qt 常用函数

设置编码 #if (QT_VERSION < QT_VERSION_CHECK(5,0,0)) #if _MSC_VERQTextCodec *codec QTextCodec::codecForName("gbk"); #elseQTextCodec *codec QTextCodec::codecForName("utf-8"); #endifQTextCodec::setCodecForLocale(codec);QTextCodec::se…

vue优化首屏加载时间优化-cdn引入第三方包

前言 为什么要进行首屏加载优化&#xff0c;因为随着我们静态资源和第三方包和代码增加&#xff0c;压缩之后包会越来越大 随着网络的影响&#xff0c;在我们第一输入url请求资源时候&#xff0c;网络阻塞&#xff0c;加载时间长&#xff0c;用户体验不好 仔细观察后就会发现…

YOLOV8实例分割——详细记录环境配置、自定义数据处理到模型训练与部署

前言 Ultralytics YOLOv8是一种前沿的、最先进的&#xff08;SOTA&#xff09;模型&#xff0c;它在前代YOLO版本的成功基础上进行了进一步的创新&#xff0c;引入了全新的特性和改进&#xff0c;以进一步提升性能和灵活性。作为一个高速、精准且易于操作的设计&#xff0c;YO…

用Jmeter压测问题解决

最近做一个基于duboo服务的接口&#xff0c;需要进行稳定性测试。但是用Jmeter GUI 方式跑只能持续2个小时左右&#xff0c;Jmeter就崩溃了&#xff0c;日志报错&#xff1a;out of memory 解决方法如下&#xff1a; 直接运行jmeter的java包试试&#xff1a; 1、打开jmeter.…

【计算机网络】http协议

目录 前言 认识URL URLEncode和URLDecode http协议格式 http方法 GET POST GET与POST的区别 http状态码 http常见header 简易的http服务器 前言 我们在序列化和反序列化这一章中&#xff0c;实现了一个网络版的计算器。这个里面设计到了对协议的分析与处…

JVM监控和调优常用命令jps|jstat|jinfo|jmap|jhat|jstack实战

1.JVM监控和调优的主要目的 性能优化:通过JVM调优,可以提高Java应用程序的性能,减少响应时间,提高吞吐量,以更好地满足用户需求。性能优化可以加快应用程序的执行速度,减少延迟,提高用户体验。 内存管理:JVM负责管理Java应用程序的内存。正确的内存管理可以避免内存泄漏…

CKEditor5定制及文件上传

CKEditor4已从2023年6月开始停止支持&#xff0c;所以最好还是升级到CKEditor5。CKEditor5在使用上与CKEditor4在使用层面上还是有很大的不同&#xff0c;首先&#xff0c;CKEditor4完全可以下载包含了所有功能的full包&#xff0c;通过配置选择需要的功能&#xff0c;只有希望…

人们对区块链的认识开始变得深入和完善,另一条新路径开始衍生

当区块链行业的发展进入到深水区&#xff0c;特别是当有关区块链的狂热与躁动开始退场&#xff0c;仅仅只是主打区块链的概念&#xff0c;而没有找到区块链与现实商业联通的方式和方法&#xff0c;依然成为困扰区块链发展的一大症结。   事实上&#xff0c;从区块链被人们认识…

STL常用容器 (C++核心基础教程之STL容器详解)String的API

在C的标准模板库&#xff08;STL&#xff09;中&#xff0c;有多种容器可供使用。以下是一些常见的容器类型&#xff1a; 序列容器&#xff08;Sequential Containers&#xff09;&#xff1a; std::vector&#xff1a;动态数组&#xff0c;支持快速随机访问。 std::list&…

宠物电商Chewy第二季度销售额28亿美元,同比增长14.3%

美国宠物电商Chewy公布2023年第二季度财报。报告显示&#xff0c;其Q2季度销售额同比增长14.3%至28亿美元&#xff0c;超出市场预期。 以下为Chewy期内业绩概要&#xff1a; 1.毛利率28.3%&#xff0c;同比增长20个基点 2.净利润有所收窄&#xff0c;同比下降15.2%至1890万美…

9.2.tensorRT高级(4)封装系列-自动驾驶案例项目self-driving-深度估计

目录 前言1. 深度估计总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习 tensorRT 高级-自动驾驶案例项目self-driving-深度估…

备战面试每日一题

1.如何理解this&#xff1f; this表示的是函数运行时自动生成的一个内部对象&#xff0c;只能在函数内部使用&#xff0c;总是指向调用它的对象。 this是在运行时进行绑定的&#xff0c;并不是在编写的时候绑定&#xff0c;它的上下文取决于函数调用时的各种条件。this的绑定…

Mybatis学习|Mybatis缓存:一级缓存、二级缓存

Mybatis缓存 MyBatis包含一个非常强大的查询缓存特性&#xff0c;它可以非常方便地定制和配置缓存。缓存可以极大的提升查询效率。 MyBatis系统中默认定义了两级缓存:一级缓存和二级缓存 默认情况下&#xff0c;只有一级缓存开启。(SqlSession级别的缓存&#xff0c;也称为本地…