TCP协议三次握手的原因是什么?为什么不用两次握手和4次握手?

news2024/12/22 17:17:43

今天复习了TCP协议的三次握手,对上一篇C++网络编程有了更深的理解。

当时考研的时候计网学过,这里再总结一下分享。网图都是截图来的,侵删。

TCP协议属于传输层协议,上面的应用层协议包括HTTP、FTP之类,应用层协议是最接近用户的,每往下一层就套一层头部数据来提供给当前层协议解析。那么对于TCP协议,上层传来的数据也会在传输层添加一个TCP头部,当然规则很复杂,我们只需要关注几个重要的就行。

主要关注32位序列号、32位确认号,和几个标志位,例如SYN,ACK,FIN

1.什么是三次握手?三次握手的流程

场景:我是客户端,你是服务器,我们不能像平常讲话一样一起说互相听得到,我不确定你听没听到,你也不确定我听没听到,而且我们所有的话都是要按顺序说的,也就是说每次我要确认你听到我所有的话之后,我才会接着说话。如何确定你收到了?

先看下面这个拟人场景,要是说不会三次握手我是不信的,其实你已经会了,不信看下面。

我:兄弟,你听得到吗,我给你个100, 你听到了给我回个101哈?

你:兄弟兄弟,收到收到,给你发个101,我给你个序列号200哈,你要是收到了给我个201?

我:兄弟,我看到你发的200了,balabala开始唠嗑。

三次握手就是上面的三个步骤。

首先一开始两个机器都是关着的,服务器创建socket并且开始监听模式,详见上一篇博客https://blog.csdn.net/weixin_42324904/article/details/129269208?spm=1001.2014.3001.5501

 // 第1步:创建服务端的socket。
    int listenfd;
    if ( (listenfd = socket(AF_INET,SOCK_STREAM,0))==-1) { perror("socket"); return -1; }
 
    // 第2步:把服务端用于通信的地址和端口绑定到socket上。
    struct sockaddr_in servaddr;    // 服务端地址信息的数据结构。
    memset(&servaddr,0,sizeof(servaddr));
    servaddr.sin_family = AF_INET;  // 协议族,在socket编程中只能是AF_INET。
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);          // 任意ip地址。
    //servaddr.sin_addr.s_addr = inet_addr("192.168.190.134"); // 指定ip地址。
    servaddr.sin_port = htons(atoi(argv[1]));  // 指定通信端口。
    if (bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) != 0 )
    { perror("bind"); close(listenfd); return -1; }
    if (listen(listenfd,5) != 0 ) { perror("listen"); close(listenfd); return -1; }

客户端发起连接请求,上一篇博客https://blog.csdn.net/weixin_42324904/article/details/129269208?spm=1001.2014.3001.5501有相关代码,然后就是把上面的拟人小场景翻译过来就可以了,问题不大,还是挺简单的。

往后每次交互的时候双方都有自己的序列号,互相更新,表示数据传到哪里了,有没有传错,例如我现在给你序列号是100,那我希望你给我返回101,这个101的含义是,你100以内接收完了,希望接收到101.

注意:第三次握手可以传送数据了,所以小场景里面有巴拉巴拉,前两次都是不可以的。


两次握手的差别

三次握手如上所示,那么如果说,3次要改成2次的话,怎么改?显然是把中间那一段去掉。

我:兄弟我给你个100,你收到的话给我发个101哈

你:兄弟,我收到了你的100, 我现在给你101, 我给你一个序列号200,你给我发个201。巴拉巴拉

此时链接已经建立了,如果采用2次握手,你已经可以给我发消息了。

想一下图,我懒得画了。

考虑如下情况:

我:兄弟,我给你个100哦,你收到给我发101

。。。 没理我

我:兄弟,你咋不理我,那我给你发个200哦,你收到给我发201。

。。。(网络不太行,前面那个100的在路上没收到,现在刚到)

你:兄弟,我收到了你的100,我现在给你发101,我给你序列号300,你收到给我发301,巴拉巴拉

(这个时候链接建立了,你给我传数据了巴拉巴拉)

我:兄弟,你搞错了,100是我刚才发的,我现在要的是201不是101,你快快stop。

你:兄弟,收到了我stop

(刚才那个200的你现在才收到)

你:兄弟,我收到200了,给你201,我序列300,你给我发301.

开始正常运作。。

注意看上面红色的字,传了一波数据,这波数据是不应该的,所以会造成链接浪费。

三次握手就不会出现这样的情况。

我:兄弟,我给你发100,你给我发101

。。。没理我

我:兄弟,我给你发200,你给我发201

。。。(网络不太行,前面那个100的在路上没收到,现在刚到)

你:兄弟,我收到了你的100,我现在给你发101,我给你序列号300,你收到给我发301,巴拉巴拉

(三次链接这里不会传数据,没有巴拉巴拉,还在等我回复再传数据)

我:兄弟,你搞错了,100是我刚才发的,我现在要的是201不是101,你快快stop。

你:兄弟,收到了我stop

(刚才那个200的你现在才收到)

你:兄弟,我收到200了,给你201,我序列300,你给我发301.

开始正常。

差别就在上面那里。


累了今天不写了,择日在写

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

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

相关文章

Prometheus 监控云Mysql和自建Mysql(多实例)

本文您将了解到 Prometheus如何配置才能监控云Mysql(包括阿里云、腾讯云、华为云)和自建Mysql。 Prometheus 提供了很多种Exporter,用于监控第三方系统指标,如果没有提供也可以根据Exporter规范自定义Exporter。 本文将通过MySQL server exporter 来监控…

通达信波段主图指标公式,源码简洁原理却不简单

通达信波段主图指标公式的核心语句也就4句&#xff0c;后面的语句都是为了画图的。公式看起来比较简单&#xff0c;原理也比较巧妙&#xff0c;但是理解起来有些困难。 直接上源码&#xff1a; HH:HHV(H,5); LL:LLV(L,5); TH:BARSLAST(H>REF(HH,1)); TL:BARSLAST(L<REF(…

K8s(v1.25.1) 高可用集群(3 Master + 5 Node) Ansible 剧本部署(CRI使用docker,cri-docker)

写在前面 分享一个 k8s 高可用集群部署的 Ansible 剧本以及涉及到的一些工具的安装博文内容涉及&#xff1a;从零开始 一个 k8s 高可用 集群部署 Ansible剧本编写&#xff0c;编写后搭建 k8s 高可用 集群一些集群常用的 监控&#xff0c;备份工具安装&#xff0c;包括&#xff…

边缘计算:万字长文详解高通SNPE inception_v3推理实战

本文主要讲解利用高通SNPE进行神经网络推理&#xff0c;主要参考&#xff1a; 上手SNPE&#xff0d;推理inception_v3 - 知乎 文中是容器做的&#xff0c;在conda环境下做一样的&#xff0c;没问题&#xff0c;已跑通。 在anaconda环境中使用conda命令安装cuda、cudnn、tens…

数据结构与算法系列之单链表

&#x1f497; &#x1f497; 博客:小怡同学 &#x1f497; &#x1f497; 个人简介:编程小萌新 &#x1f497; &#x1f497; 如果博客对大家有用的话&#xff0c;请点赞关注再收藏 &#x1f31e; 这里写目录标题test.hSList.h注意事项一级指针与二级指针的使用assert的使用空…

内大892复试真题19年

内大892复试真题19年 1. 统计低于平均分的人数2. 输出数组中最大值3. 一元二次方程求根4. 字符串数组平移(反转法)5. 矩阵乘法(分治+strassen思想)1. 统计低于平均分的人数 问题 代码 #include <iostream>using namespace std;// 函数声明 double avgFunc

0098 Mysql01

1.登录Mysql mysql -uroot -p密码 2.Mysql常用命令 退出:exit 查看mysql有哪些数据库&#xff1a;show databases;(以分号结尾) 选择使用某个数据库&#xff1a;use sys; (表示正在使用一个名叫sys得数据库) 创建数据库&#xff1a;create database bjpowernode; 查看某个数…

FFmpeg入门 - 格式转换

1、音频分⽚(plane)与打包(packed)解码出来的AVFrame,它的data字段放的是视频像素数据或者音频的PCM裸流数据,linesize字段放的是对齐后的画面行长度或者音频的分片长度:/*** For video, size in bytes of each picture line.* For audio, size in bytes of each plane.** For …

Python3 入门教程||Python3 条件控制||Python3 循环

Python3 条件控制 if语句 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块。 Python 中 if 语句的一般形式如下所示&#xff1a; if condition_1:statement_block_1 流程图如下所示&#xff1a; 这种if语句只有在符合条件的时候才会执行代…

华大Flash檫写导致重启异常问题

一、华大Flash写入注意事项由Flash操作说明我们可以看出重要一点&#xff0c;就是檫写Flash函数地址需要定义在32K之前&#xff08;即0x8000之前&#xff09;&#xff0c;否则将写入失败。二、先上的错误的源代码这个代码是我应用中导致硬件卡死重启的&#xff0c;其实也不算错…

FreeSWITCH 呼入系统的简要设计

文章目录1. 呼入处理方案2. 细节处理1. a-leg 的拨号计划2. originate 呼叫坐席1. 呼入处理方案 使用 FreeSWICTH 的 ESL 模块&#xff0c;一个简单的呼入处理时序如下图所示&#xff0c;关键步骤做如下补充: 用户呼入到 FreeSWITCH 实例&#xff0c;a-leg 创建FreeSWITCH 根据…

DC真实数据都有哪些?Filecoin为DC数据存储的解决方案又是什么?

对于生活在数字时代的我们而言&#xff0c;数据或许就和平日呼吸的空气一样&#xff0c;已经不需要我们再去思考其概念。我们的日常生活中无时无刻都有数据的身影&#xff0c;日常的购物消费、出行、学习、记录&#xff0c;当我们每天生活有数字化加持的小区里&#xff0c;工作…

网上图书资料管理系统

技术&#xff1a;Java、JSP等摘要&#xff1a;Internet带给我们的不仅是无穷的信息&#xff0c;更为我们带来了很多的便利。在这个科技高速发展的时代&#xff0c;网络应用十分广泛&#xff0c;所以许多人愿意通过网络来使他们的生活变得更加的方便。网上图书资料管理系统的出现…

Spring Cloud(微服务)学习篇(五)

Spring Cloud(微服务)学习篇(五) 1 nacos配置文件的读取 1.1 访问localhost:8848/index.html并输入账户密码后进入nacos界面并点击配置列表 1.2 点击右侧的号 1.3 点击加号后,进入新建配置界面,并做好如下配置 1.4 往下翻动,点击发布按钮 1.5 发布成功后的界面 1.6 在pom.xml…

ChatGPT解答:PYQT5 的mwindow源码文件里面写了很多的函数方法,随着时间的推移越来越多,代码行数太多,影响了性能,如何解决

ChatGPT解答&#xff1a; PYQT5 的mwindow源码文件里面写了很多的函数方法&#xff0c;随着时间的推移越来越多&#xff0c;代码行数太多&#xff0c;影响了性能&#xff0c;如何解决 以下为可复制的内容与实例&#xff1a; PYQT5 的mwindow源码文件里面写了很多的函数方法&a…

第一道pwn栈溢出题

代码和解题思路来自启明星辰的《ctf安全竞赛入门》&#xff0c;当然还有好多热心的师傅们的指导。1.代码&#xff1a;#include "stdio.h" void shell() {system("/bin/sh"); } void vuln() {printf("Please input your name:\n");char s[8];gets…

实现pdf文件预览

前言 工作上接到的一个任务&#xff0c;实现pdf的在线预览&#xff0c;其实uniapp中已经有对应的api&#xff1a;uni.openDocument(OBJECT)&#xff08;新开页面打开文档&#xff0c;支持格式&#xff1a;doc, xls, ppt, pdf, docx, xlsx, pptx。&#xff09;**实现了相关功能…

冬奥会信息管理系统

摘 要伴随着社会以及科学技术的发展&#xff0c;互联网已经渗透在人们的身边&#xff0c;网络慢慢的变成了人们的生活必不可少的一部分&#xff0c;紧接着网络飞速的发展&#xff0c;系统管理这一名词已不陌生&#xff0c;越来越多的体育馆等机构都会定制一款属于自己个性化的管…

【小程序】盒模型笔记

边框样式参数border中solid是实线&#xff0c;dotted是点状&#xff0c;dashed是虚线。还有其它一些&#xff0c;double(双边框)&#xff0c;groove,ridge,inset,outset等3D边框。可单独拎出来定义边框宽度&#xff0c;border-width由前篇可知&#xff0c;padding\margin上下左…

Python 元类编程实现一个简单的 ORM

概述 什么是ORM?    ORM全称“Object Relational Mapping”&#xff0c;即对象-关系映射&#xff0c;就是把关系数据库的一行映射为一个对象&#xff0c;也就是一个类对应一个表&#xff0c;这样&#xff0c;写代码更简单&#xff0c;不用直接操作SQL语句。 现在我们就要实…