学习计算机网络中的一些疑问及解答

news2024/10/5 21:15:04

文章目录

  • 前言
  • 一、为什么要进行三次握手
  • 二、三次握手的流程
  • 三、三次握手中seq和ack的值
  • 四、四次挥手流程
  • 五、四次挥手中seq和ack的值
  • 六、为什么要等待才回复
  • 七、为什么等待2MSL
  • 总结


前言

一个本硕双非的小菜鸡,备战24年秋招,在学习计算机网络的过程中遇到了一些问题,思考并解答。
部分参考小林大佬的解答 :小林coding

一、为什么要进行三次握手

因为三次握手才能保证双方具有接收和发送的能力。
三次握手才可以阻止重复历史连接的初始化(主要原因)
三次握手才可以同步双方的初始序列号
三次握手才可以避免资源浪费

通过三次握手能防止历史连接的建立,能减少双方不必要的资源开销,能帮助双方同步初始化序列号。序列号能够保证数据包不重复、不丢弃和按序传输。

不使用「两次握手」和「四次握手」的原因:
「两次握手」:无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列号;
「四次握手」:三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数。

二、三次握手的流程

请添加图片描述

  1. 一开始,客户端和服务端都处于CLOSE状态。先是服务端主动监听某个端口,处于 LISTEN状态。
  2. 然后客户端主动发起连接 SYN,之后处于 SYN-SEND 状态。此时发送的是一个特殊的TCP报文段,该报文段不包含应用层数据,但是在报文段的首部中的一个标志位被置为1,会随机选择一个初始序号client_sin,该报文段也称SYN报文段。
  3. 服务端收到发起的连接,返回 SYN,并且 ACK 客户端的 SYN,之后处于SYN-RCVD 状态。该报文段SYN比特被置为1,首部的确认字号段被置为client_sin + 1,并选择自己的初始序号(server_isn)将其放置到TCP报文段首部的序号字段中,该报文段也称SYNACK报文段。。
  4. 客户端收到服务端发送的 SYN 和ACK 之后,发送 ACK的 ACK,之后处于ESTABLISHED 状态,因为它一发一收成功了。该SYN比特置0,确认号字段server_isn+ 1,初始序号为client_sin + 1,并且可以在报文段负载中携带客户到服务器的数据。
  5. 服务端收到 ACK的 ACK 之后,处于 ESTABLISHED 状态,因为它也一发一收了。

三、三次握手中seq和ack的值

seq(初始序号)与ack(确认号)
一次:client_sin,暂无
二次:server_isn,client_sin + 1
三次:client_sin + 1,server_isn + 1

四、四次挥手流程

请添加图片描述

  1. 主动方打算关闭连接,此时会发送一个 TCP首部 FIN 标志位被置1的报文,也即 FIN报文,之后主动方进入 FIN WAIT_1 状态。
  2. 被动方收到该报文后,就向主动方发送 ACK应答报文,接着被动方进入 CLOSED_WAIT 状态。
  3. 主动方收到被动方的 ACK 应答报文后,之后进入 FIN WAIT 2状态
  4. 等待被动方处理完数据后,也向主动方发送FIN 报文,之后被动方进入 LAST_ACK 状。
  5. 主动方收到被动方的 FIN 报文后,回一个ACK 应答报文,之后进入 TIME WAIT 状态。
  6. 被动方收到了 ACK 应答报文后,就进入了CLOSED 状态,至此被动方已经完成连接的关闭。
  7. 主动方在经过 2MSL 一段时间后,自动进入CLOSED 状态,至此主动方也完成连接的关闭。
    但是在特定情况下,四次挥手是可以变成三次挥手的

五、四次挥手中seq和ack的值

seq(初始序号)与ack(确认号)
一次:client_sin,server_isn + 1
二次:server_isn + 1,client_sin + 1
三次:server_isn + 2,client_sin + 1
四次:client_sin + 1,server_isn + 3

六、为什么要等待才回复

防止历史连接中的数据,被后面相同四元组的连接错误的接收;
保证「被动关闭连接」的一方,能被正确的关闭;

七、为什么等待2MSL

最后一个等2MSL(一个MSL是报文段的最大存活时间),2MSL保证最后一个ACK对方一定收到。
网络中可能存在来自发送方的数据包,当这些发送方的数据包被接收方处理后又会向对方发送响应,所以一来一回需要等待 2 倍的时间。
可以看到 2MSL时长 这其实是相当于至少允许报文丢失一次。

总结

网络初学,主要是为了CSAPP的最后一个Lab,以后有时间考虑看看CS144(网络这方面我当时学的是真的菜)。

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

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

相关文章

CLR via C#(三)垃圾回收

一、资源生命周期 每个程序运行都需要各种资源,如文件、内存缓冲区、数据库等。要使用这些资源,就必须为代表资源的类型分配内存。访问一个资源所需的步骤如下: 调用IL指令newobj,为代表资源的类型分配内存(在C#中一…

NSS [HNCTF 2022 WEEK2]ohmywordpress(CVE-2022-0760)

NSS [HNCTF 2022 WEEK2]ohmywordpress(CVE-2022-0760) 题目描述:flag在数据库里面。 开题: 顺着按钮一直点下去会发现出现一个按钮叫安装WordPress 安装完之后的界面,有一个搜索框。 F12看看network。 又出现了这个…

在 Android 设备或仿真器上进行测试

🎬 岸边的风:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 Windows Defender 概述 如何将排除项添加到 Windows Defender Android 开发时要考虑的排除项 本指南介绍如何在 W…

JavaScript逆向循环和嵌套循环

逆向循环 ● 我们还是使用以下这个数组进行演示 const ITshareArray ["张三","二愣子",2033 - 1997,"程序员",["李四", "王五", "牛二"], ];● 现在我们还是想循环的列出数组的值,但是我们倒着来&a…

l14 IO模型

一、基本概念 I/O即数据的读取&#xff08;接收&#xff09;或写入&#xff08;发送&#xff09;操作 通常用户进程中的一个完整I/O分为两个阶段 1.用户进程空间<-->内核空间 2.内核空间<-->设备空间&#xff08;磁盘、网卡等&#xff09; I/O分为内存I/O、网络…

Bash脚本学习 - 条件句、数组、for循环,函数

1. 条件测试 [ 和 ] 是一个用于执行条件测试的命令。它们必须用空格分隔开&#xff0c;并且在 [ 后面和 ] 前面必须有空格。-eq 是一个比较运算符&#xff0c;表示等于&#xff08;equal&#xff09;。它用于比较两个值是否相等。 2. 条件句 在 ifelseifelse.sh 文件中&#…

Acwing 827. 双链表

Acwing 827. 双链表 题目要求思路讲解初始化在第k个点右边插入&#xff1a;如果想在k的左边插入x&#xff0c;只要这样调用就可以了&#xff1a;删除怎么做&#xff1a; 代码展示 题目要求 思路讲解 初始化 在第k个点右边插入&#xff1a; 如果想在k的左边插入x&#xff0c;只…

【算法训练-二叉树 一】【遍历二叉树】前序遍历、中序遍历、后续遍历、层序遍历、锯齿形层序遍历、二叉树右视图

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【二叉树的遍历】&#xff0c;使用【二叉树】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为…

如何实现一个IO口读取多个设备信息

前言 &#xff08;1&#xff09;今天遇到一个有意思的问题一个IO口如何读取多个电机的堵转问题。之后他就发了一张图片 &#xff08;2&#xff09;看到这个问题&#xff0c;之前先说一个简单的。我们如何实现一个IO读取多个按键&#xff0c;了解了这个之后&#xff0c;对于多个…

Python 变量

视频版教程 Python3零基础7天入门实战视频教程 变量 无论使用什么语言编程&#xff0c;总要处理数据&#xff0c;处理数据就需要使用变量来保存数据。变量就像一个个小容器&#xff0c;用于“盛装”程序中的数据。 再说说&#xff0c;Python的数据类型&#xff0c;有以下六种…

Prometheus+Grafana 基础监控告警体系搭建(一):服务的基本安装

文章目录 1. prometheus 安装1.1. 下载安装包1.2. 基本设置1.3. 解压安装包1.4. 配置 service 启动文件1.5. 启动服务 2. Grafana 安装2.1. 下载安装包2.2. 安装2.3. 启动服务 3. 总结一下 打算重新练下手&#xff0c;免得忘记了&#xff0c;这次内网进行了全面部署演示&#x…

编程任务|随机摆放的刀叉开始认识数学思维

任务源自旧版的Brilliant数学讨论问题。2019-09-02我曾经发布过&#xff0c;可惜已经下线&#xff0c;幸活大喵做足备份。 该问题看似是概率问题&#xff0c;实则不然。 官方给出的解法透露出一个非常重要的数学思维方法&#xff1a; 数学语言 —— 为何以及如何构造一个函数 f…

计算机丢失msvcr110.dll解决办法,多种msvcr110.dll解决方法分享

随着 Windows 操作系统的发展&#xff0c;越来越多的用户在使用电脑时遇到了计算机丢失 msvcr110.dll 的问题。msvcr110.dll 是 Windows 操作系统中的一个动态链接库文件&#xff0c;它包含了许多常用的 C 运行库函数。因此&#xff0c;当计算机丢失 msvcr110.dll 时&#xff0…

Kotlin File useLines nameWithoutExtension extension

Kotlin File useLines nameWithoutExtension extension import java.io.Filefun main(args: Array<String>) {val filePath "myfile.txt"val file File(filePath)println(file.name) //文件名字&#xff0c;不包括路径println(file.isFile) //是文件吗pri…

PTA:7-4 顺序表(删除)

顺序表&#xff08;删除&#xff09; 题目输入样例输出样例 代码 题目 输入样例 10 55 11 9 15 67 12 18 33 6 22 10 20输出样例 55 9 67 33 6 22代码 #include<iostream> using namespace std; void deletes(int* arr, int& sz, int left, int right) {int newId…

Vue入门简介(带你打开Vue的大门)

目录 前言 一、Vue简介 1. 什么是Vue 2. Vue的应用场景 3. Vue的作用&#xff08;重要性&#xff09; 4. 什么是MVVM模式 5. 开源库网址 二、Vue入门使用 1. 基础使用步骤 1.1 引入Vue.js 1.2 创建Vue实例 1.3 编写Vue模板 1.4 数据绑定与指令 1.5 调用Vue方法和…

【C++】哈希位图和布隆过滤器

哈希位图优缺点位图应用模拟实现代码 哈希布隆过滤器哈希布隆过滤器的提出哈希布隆过滤器概念模拟实现代码 为什么哈希布隆图要比位图省空间 哈希位图和布隆过滤器都是常用的概率数据结构&#xff0c;用于高效地判断一个元素是否存在于一个集合当中&#xff0c;但它们在实现方法…

The driver has not received any packets from the server

在测试数据迁移时遇到的错误。 目录 一、错误 二、解决 三、数据迁移测试 3.1 环境 3.2 源码及测试 3.2.1 源码 3.2.2 测试结果&#xff08;太慢&#xff09; 3.2.3 源码修改 3.2.4 异常及解决 一、错误 The driver has not received any packets from the server. 二…

关于软件测试的方法详解,你知道多少呢?

一、 软件测试方法 1. 软件测试方法包括&#xff1a;白盒测试(White Box Testing)、黑盒测试(Black Box Testing)、灰盒测试、静态测试、动态测试。 2. 白盒测试&#xff1a;是一种测试用例设计方法&#xff0c;在这里盒子指的是被测试的软件&#xff0c;白盒&#xff0c;顾名…

想要精通算法和SQL的成长之路 - 最长回文子序列

想要精通算法和SQL的成长之路 - 最长回文子序列 前言一. 最长回文子序列 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 最长回文子序列 原题链接 首先&#xff0c;我们看下动态规划方程的定义&#xff0c;我们用dp[i][j] 来代表&#xff1a;字符串s在下标区间为[i,j]之间…