计网-三次握手和四次挥手

TCP建立和断开连接的过程(三次握手和四次挥手)

TCP通信的过程:

问题:tcp是如何保证数据在客户端和服务端之间通信传输的?
分为三个步骤:三次握手,传输数据确认,四次挥手。三次握手是建立连接,而四次握手是断开连接的过程。

Tcp的概念

传输层协议,提供host-to-host数据的可靠传输,支持全双工,是一个连接导向的协议。
主机到主机(host-to-host):一台主机通过tcp发送数据给另一台主机。

Tcp/ip 5层模型

Tcp协议往上是应用到应用的协议。–应用层
Tcp上层的应用层协议使用tcp时,需要知道端口号----用于区分应用–传输层
主机与主机之间通信,需要知道主机们的网络地址(ip地址),但是tcp不负责把实际地址到地址的传输,tcp把ip交给了底层的互联网层进行处理–网络层
互联网层,也叫网络层,提供地址到地址之间的通信。但不负责信号在具体两个设备之间的传递–链路层,当信号在两个设备之间传递时,又需要物理层封装最底层的物理设备,传输介质等提供最底层的传输能力–物理层
综合以上的5层被称为互联网协议群,也称作tcp/ip协议群总结下,主机到主机为应用提供到应用间通信的能力。

什么是连接和会话?

连接–数据传输双方都在线,数据收发双方的内存中都建立一个用于维护数据传输状态的对象,连接是网络行为状态的记录。客户端需要与服务器建立连接。
会话:数据双方聊天窗口,是应用的行为。在有些系统中,会话会自动重连,或帮助创建连接,会话也负责在多次连接中保存状态,比如HTTP session在多次http请求(连接)间保存状态(如用户信息)。

双工和单工

  • 单工:数据只能单向发送,至少一条线路
  • 半双工:某时刻数据向一个方向传输,也可以反方向传输(交替进行),至少一条线路
  • 全双工:任何时刻数据都可以双向收发,需要大于一条线路
    注:这里的线路抽象,并发的处理信号。
    Tcp是一个双工协议,数据在任何时候都可以双向传输。

什么是可靠性?

Tcp是可靠性传输。
可靠性指数据保证无损(原顺序)传输。如果发送方把数据发送给多个接收方—多播,那么所有的接收方都必须收到这个相同的副本。

Tcp的握手和挥手(建立和断开连接)

Tcp的基本操作

  • 如果一个host主动向另一个host发起连接,称为SYN,请求同步
  • 如果一个host主动主动断开请求,称为FIN,请求完成
  • 如果一个host给另一个host发送数据,称为PSH,数据推送

以上3种,接收方收到数据后需要给发送方一个ACK响应,若没有,发送方可能认为自己需要重发这个请求。请求/响应模型是可靠性的要求。

建立连接的过程(三次握手)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
为什么要三次握手而不是两次握手?
这是为了防止因为已失效的请求报文,突然又传到服务器,引起错误, 这是什么意思?
假设采用两次握手建立连接,客户端向服务端发送一个syn包请求建立连接,因为某些未知的原因,并没有到达服务器,在中间某个网络节点产生了滞留,为了建立连接,客户端会重发syn包,这次的数据包正常送达,服务端发送syn+ack之后就建立起了连接。
但是第一包数据阻塞的网络突然恢复,第一包syn包又送达到服务端,这时服务端会认为客户端又发起了一个新的连接,从而在两次握手之后进入等待数据状态,服务端认为是两个连接,而客户端认为是一个连接,造成了状态不一致,如果在三次握手的情况下,服务端收不到最后的ack包,自然不会认为连接建立成功。
所以三次握手本质上来说就是为了解决网络信道不可靠的问题,为了在不可靠的信道上建立起可靠的连接,经过三次握手之后,客户端和服务端都进入了数据传输状态。

断开连接的过程(四次挥手)

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

react的解构赋值

我最近在用react讨生活。我的感觉,react开发效率不高。这当然应该是我还不熟悉react的缘故。但是,在阅读react代码过程中,其中一个容易困惑的地方是它到处充斥着的解构赋值。当然了,解构赋值并不是React特有的功能,而是…

OpenCV距离变换函数distanceTransform的使用

操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:Visual Studio Code编程语言:C11 功能描述 distanceTransform是OpenCV库中的一个非常有用的函数,主要用于计算图像中每个像素到最近的背景(通常是非零像素到零像素&…

tkinter-TinUI-xml实战(12)pip可视化管理器

引言 pip命令行工具在平常使用方面确实足够简单,本项目只是作为TinUI多界面开发的示例。 当然,总有人想用GUI版pip,实际上也有。不过现在,我们就来手搓一个基于python和TinUI(tkinter)的pip可视化管理器。…

数据结构——考研笔记(二)线性表的定义和线性表之顺序表

文章目录 二、线性表2.1 定义、基本操作2.1.1 知识总览2.1.2 线性表的定义2.1.3 线性表的基本操作2.1.4 知识回顾与重要考点 2.2 顺序表2.2.1 知识总览2.2.2 顺序表的定义2.2.3 顺序表的实现——静态分配2.2.4 顺序表的实现——动态分配2.2.5 知识回顾与重要考点2.2.6 顺序表的…

【分库】分库的设计与原则、数据分片策略、垂直分库与水平分库、数据库引擎选择与配置优化

目录 引言 分库设计原则 数据分片策略的选择 垂直分库 vs 水平分库的比较 数据库引擎选择与配置优化 引言 在面对日益增长的数据量和不断升级的业务需求时,传统的单体数据库架构往往难以应对高并发、大数据量带来的性能瓶颈。为了突破这些限制,分库…

C++ 桥接模式 (Bridge Pattern)

C 桥接模式 (Bridge Pattern) flyfish 桥接模式是一种结构型设计模式,旨在将抽象部分与它的实现部分分离,使它们可以独立地变化。桥接模式可以使一个类的功能层次结构与实现层次结构分离。它通过引入一个中间接口(桥接接口)将具…

godis源码分析——database存储核心1

前言 redis的核心是数据的快速存储,下面就来分析一下godis的底层存储是如何实现,先分析单机服务。 此文采用抓大放小原则,先大的流程方向,再抓细节。 流程图 源码分析 现在以客户端连接,并发起set key val命令为例…

Ansible 安装及使用说明

方案1. 直接下载 源码包到本地后安装 ansible 下载地址:https://releases.ansible.com/ansible/ ansible社区: https://github.com/ansible/ansible 下载地址:GitHub - ansible/ansible at v2.9.0 方案2. 以腾讯的yum源说明:腾讯云文档…

Pytorch lr_scheduler 调整学习率

Pytorch lr_scheduler 调整学习率 背景 上篇文章连接 在运行 VGG 代码的时候有这么几行代码: # 定义模型进行训练 model VGG16() # model.load_state_dict(torch.load(./my-VGG16.pth)) optimizer optim.SGD(model.parameters(), lr0.01, weight_decay5e-3) l…

vue3中谷歌地图+外网申请-原生-实现地址输入搜索+点击地图获取地址回显 +获取国外的geoJson实现省市区级联选择

一. 效果&#xff1a;输入后显示相关的地址列表&#xff0c;选中后出现标示图标和居中定位 1.初始化谷歌地图 在index.html加上谷歌api请求库 <script src"https://maps.googleapis.com/maps/api/js?key申请到的谷歌地图密钥&vweekly&librariesgeometry,place…

基于TCP的在线词典系统(分阶段实现)(阻塞io和多路io复用(select)实现)

1.功能说明 一共四个功能&#xff1a; 注册 登录 查询单词 查询历史记录 单词和解释保存在文件中&#xff0c;单词和解释只占一行, 一行最多300个字节&#xff0c;单词和解释之间至少有一个空格。 2.功能演示 3、分阶段完成各个功能 3.1 完成服务器和客户端的连接 servic…

Vue el-input 限制输入内容

&#x1f914;日常项目中经常遇到既要el-input的样式&#xff0c;又要el-input-number限制&#xff0c;所以需要绑定input事件进行约束输入限制。 以下使用自定义指令进行约束el-input输入的值&#xff0c;便于后期统一管理和拓展。 预览 代码 <!DOCTYPE html> <ht…

响应式编程-数据劫持

响应式编程的核心思想是观察者模式&#xff0c;被观察的对象我们可以称之为数据源&#xff0c;所以&#xff0c;数据是响应式编程所关注的核心。 假设有一个数据对象,有一个字段age值为18&#xff1a; let obj {age:18 } 然后有一个函数&#xff0c;在这个函数打印age字段&a…

quota使用

一、检查系统是否支持 grep CONFIG_QUOTA /boot/config* CONFIG_QUOTAy CONFIG_QUOTA_NETLINK_INTERFACEy # CONFIG_QUOTA_DEBUG is not set CONFIG_QUOTA_TREEy CONFIG_QUOTACTLy CONFIG_QUOTACTL_COMPATy二、安装 yum install -y quota三、配置 3.1 创建磁盘 格式一定要 …

【RPC注册发现框架实战】一个简易的RPC注册发现框架

Java实现 服务端起10个线程ID监听40-49这10个端口&#xff0c;这10个端口注册到注册中心&#xff0c;提供同一个服务&#xff0c;发个A&#xff0c;响应B&#xff0c;客户端起10个线程去注册中心请求 好的&#xff0c;我们可以通过实现一个简单的服务端、注册中心和客户端来达到…

【机器学习】精准农业新纪元:机器学习引领的作物管理革命

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀目录 &#x1f50d;1. 引言&#x1f4d2;2. 精准农业的背景与现状&#x1f341;精准农业的概念与发展历程&#x1f342;国内外精准农业实践案…

002-ESP32怎么 上电就能启动指定代码

ESP32在上电后能够启动指定代码&#xff0c;主要依赖于其内部的启动流程和固件配置。以下是一个详细的步骤说明&#xff0c;以及如何实现这一功能&#xff1a; 一、ESP32的启动流程 ESP32的启动流程大致可以分为以下几个阶段&#xff1a; 一级引导程序&#xff1a;被固化在ES…

【数据结构】手写堆 HEAP

heap【堆】掌握 手写上浮、下沉、建堆函数 对一组数进行堆排序 直接使用接口函数heapq 什么是堆&#xff1f;&#xff1f;&#xff1f;堆是一个二叉树。也就是有两个叉。下面是一个大根堆&#xff1a; 大根堆的每一个根节点比他的子节点都大 有大根堆就有小根堆&#xff1…

Qt/QML学习-BusyIndicator

QML学习 BusyIndicator例程视频讲解代码 main.qml import QtQuick 2.15 import QtQuick.Window 2.15 import QtQuick.Controls 2.15Window {width: 640height: 480visible: truetitle: qsTr("Hello World")BusyIndicator {id: busyIndicatoranchors.fill: parentM…

深入解析std::string的设计哲学【C++、STL库】

为什么在C中字符串长度需要调用函数而不是直接访问&#xff1f;深入解析std::string的设计哲学 在C中&#xff0c;获取字符串长度需要调用size()或length()方法&#xff0c;而不是直接访问一个常量或属性。这一设计让许多初学者感到困惑。那么&#xff0c;为什么C会选择这种方…