《网络是怎样连接的》(二.1)

(83条消息) 《网络是怎样连接的》(一)_qq_38480311的博客-CSDN博客

本文主要取材于  《网络是怎样连接的》 第二章。

目录

(1)创建套接字

(2)连接服务器

(3)收发数据

(4)从服务器断开连接

TCP 整体流程


简述:将探索操作系统中的网络控制软件(协议栈)和网络硬件(网卡)是如何将浏览器的消息发送给服务器的。

客户端会创建套接字(一块内存),记录控制信息,然后协议炸根据套接字里的内容去和服务端连接。服务端的套接字是提前创建好的,等待客户端过来连接,连接过程双方各会开辟一块内存,叫做缓冲区缓冲数据。连接服务器实际是发送控制包到服务器,包头里包含着客户端的信息,这个包相当于去建“管道”的工人。连接建好后发送数据时,数据会在缓存区到达一定数量时才发送(为了避免频繁的小包),此过程中 通过发送端的序号以及接收端的ACK号可以判断包是否正确收到。收到的包在接收端也会先存到缓冲区,进行原始数据组合之后提交给应用。通信结束之后,会进行断开(断开是四次握手),删除套接字。

本章共六个章节,主要理解前四节,上一章提到 收发数据操作(TCP/IP)是以下四个步骤:

(1)创建套接字(创建套接字阶段)(2)将管道连接到服务器端的套接字上(连接阶段)(3)收发数据(通信阶段)(4)断开管道并删除套接字(断开阶段)

(1)创建套接字

从应用程序收到委托后,协议栈通过TCP协议收发数据的操作可以分为4个阶段。首先是创建套接字,在这个阶段,我们将介绍协议栈的内部结构、套接字的实体,以及创建套接字的操作过程。到这里,大家应该可以对套接字到底是什么样的一个东西有一个比较具体的理解。

如何理解协议栈?

协议栈就是一套规则,如上图所示,上下层有一定的规则,上层会委派下层去做一些工作,下层按照上层的指示执行工作。

应用程序的下面是Socket库,其中包括解析器,解析器用来向DNS服务器发出查询IP,详见第一章。

操作系统 协议栈的上半部分有两块,分别是负责用TCP协议收发数据的部分和负责用UDP协议收发数据的部分,它们会接受应用程序的委托执行收发数据的操作。

下面一半是用IP协议控制网络包收发操作的部分。在互联网上传送数据时,数据会被切分成一个一个的网络包。

IP下面的网卡驱动程序负责控制网卡硬件,而最下面的网卡则负责完成实际的收发操作,也就是对网线中的信号执行发送和接收的操作。

套接字是什么?如何生成的?

套接字只是一个概念,不存在实体,如果一定要赋予它一个实体,这些控制信息就是套接字的实体。协议栈在执行操作时需要参阅这些控制信息,如套接字中的通信对象IP地址和端口号,以便向指定的IP地址和端口发送数据。

 创建套接字,就是先开辟一个内存空间,将控制信息写入。接下来需要把套接字的描述符给应用程序,即把自己的号码牌给app,让app知道用哪个套接字通信。接下来,当app委托协议栈发送消息时,只需要提供描述符即可。创捷套接字之后,浏览器会调用connect,协议栈会将本地套接字与服务器套接字进行连接。

对套接字的理解:当于是一块记录了控制信息的牌子。假如我是app一个快递收发大户,我每次发快递需要告诉快递员 我这个快递需要发给谁,地址是什么,电话是什么,如果每次都说,我很累。

但是,假如我把我需要的发货地址信息全部编号,写在一张张号码牌上(即创建套接字)。

我只需要告诉快递员快递的发货信息是几号就行(调用cennect进行连接,让协议栈知道ip等信息),比如我(app)拿了个快递(消息),给快递员(协议栈)说,这个快递给我发1号,快递员自己会找1号对应的地址,各类信息等等。

服务器也会创建套接字。但是服务器的套接字并不知道通信对象是谁,因为连服务器上的app自己都不知道通信对象是谁。所以需要客户端过来请求,告诉服务器,“我想和你通信,我的ip是**,端口号是&&,我们通信吧。” 此外,当执行数据收发操作时,我们还需要一块用来临时存放要收发的数据的内存空间,这块内存空间称为缓冲区,它也是在连接操作的过程中分配的。

(2)连接服务器

接下来是客户端套接字向服务器套接字进行连接的阶段。我们将介绍“连接”具体是进行怎样的操作,在这个过程中协议栈到底是如何工作的,以及客户端和服务器是如何进行交互的。

 客户端先创建一个包含表示开始数据收发操作的控制信息的头部, 然后 TCP会将头部委托给IP模块,IP模块执行包发送,包到达服务器, 服务器上的IPI将接收到的数据传递给TCP模块,服务器的TCP模块根据TCP头部中的信息找到端口号对应的套接字,然后套接字中会写入相应的信息,并将状态改为正在连接。 

这个过程TCP头部中请求 有SYN = 1,表示请求,服务器收到包后 相应将ACK控制位设为1, 然后 客户端会再回一个 ACK控制位设为1。 这个应该就是TCP三次握手的过程。

(3)收发数据

连接好之后,双方怎么发数据呢?

为避免频繁小包,协议栈会将数据存放在内部的发送缓冲区,等到数据累计一定数量发,或者等待一段时间若数据不满也发送(避免响应太迟);对于非常大的数据拆分为小包发送。那么对于发送的数据如何确定收到呢?拆分的数据怎么组装呢?TCP模块会拆分数据,算好每一块数据相当于从头开始的第几个字节,将算好的字节数写在TCP头部中,“序号”字段就是派在这个用场上的。收端收到了包回复ACK号,通过“序号”和“ACK号”可以确认接收方是否收到了网络包(可以判断丢失重发等)。当接收方的TCP收到包后,会先将数据存放到接收缓冲区中,然后将数据块组装起来还原成原本的数据并传递给应用程序。

(4)从服务器断开连接

并删除套接字收发消息的操作全部结束之后,接下来要断开服务器的连接并删除套接字。断开操作的本质是当消息收发完成后客户端和服务器相互进行确认的过程。

服务器和客户端 谁都可以选择先断开。

若客户端先发起断开,则断开的操作顺序如下。

(1)客户端发送FIN(2)服务器返回ACK号(3)服务器发送FIN(4)客户端返回ACK号

服务断开后,一般套接字 需要等几分钟再删除。(例如第三步发的FIN重发了,在网络中呆了好久到达客户端,客户端的端口已经被新的套接字占用了,然后新的连接可能就断了)

TCP 整体流程

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

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

相关文章

jdk,jre和jvm三者的关系和区别

目录 一、三者的关系 二、JDK的概念 三、JRE的概念 四、JVM的概念 五、三者区别 一、三者的关系 从图中可以清楚地看到,他们之间的关系是JDK包含JRE, JRE又包含JVM。 因此,JDK包含JRE和JVM。 JDK JRE Java 开发工具包 [Java,Javac,Javadoc,Javap…

【stm32L152】段码屏驱动注解、MX_LCD_Init()初始化失败的解决方法

文章目录 断码屏驱动补充MX_LCD_Init()驱动初始化失败 断码屏驱动补充 已经有大神写过较详细的教程:https://blog.csdn.net/CSDN_Gao_16/article/details/115463499,但这篇博文仍然比较抽象,我看了好多遍才看明白-_-||,为了节省和…

WPF实战学习笔记19-备忘录添加功能

文章目录 备忘录添加功能memoviewmodel.csmemo.view修改控制器 备忘录添加功能 由于todoview 和 memoview的相似度很高,可复制todoview 的代码。 memoviewmodel.cs using Mytodo.Common.Models; using Mytodo.Service; using Prism.Commands; using Prism.Ioc; u…

Redis如何实现原子性自增自减

一、背景 假设有一个需求,包含简单的两个步骤: 第一步是用户获取验证码,检验验证码成功后跳转到表单填写页面;第二步是用户填写表单并提交申请。 为了防止用户跳过第一步直接提交申请,我们采取了以下策略&am…

9 君正音频采集的封装

概述 在IPC中,需要将设备端的声音采集后进行编码,然后发送给客户端或者监控平台。君正SDK中的音频功能包括5个模块,分别是:音频输入、音频输出、回声消除、音频编码和音频解码。其中,音频输入和音频输出存在设备(Device)和通道(Channel)的概念。一个MIC被认为是一个录…

【Java基础教程】(四十四)IO篇 · 上:解析Java文件操作——File类、字节流与字符流,分析字节输出流、字节输入流、字符输出流和字符输入流的区别

Java基础教程之IO操作 上 🔹本节学习目标1️⃣ 文件操作类:File2️⃣ 字节流与字符流2.1 字节输出流:OutputStream2.2 字节输入流:InputStream2.3 字符输出流:Writer2.4 字符输入流:Reader2.5 字节流与字符…

力扣27 26 283 844 977 移除数组

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的…

电脑新装系统优化,win10优化,win10美化

公司发了新的笔记本,分为几步做 1.系统优化,碍眼的关掉。防火墙关掉、页面美化 2.安装必备软件及驱动 3.数据迁移 4.开发环境配置 目录 目录复制 这里写目录标题 目录1.系统优化关掉底部菜单栏花里胡哨 2.安装必备软件及驱动新电脑安装360 1.系统优化 关掉底部菜单…

WPF MVVM之INotifyPropertyChanged接口的几种实现方式

序言 借助WPF/Sliverlight强大的数据绑定功能,可以比实现比MFC,WinForm更加优雅轻松的数据绑定。但是在使用WPF/Silverlight绑定时,有件事情是很苦恼的:当ViewModel对象放生改变,需要通知UI。我们可以让VM对象实现INot…

es通过rest接口_search、_delete_by_query查询与删除数据

1、rest接口查询数据 rest查询: http://localhost:9200/index_name/_search 查询表达式: {"query": {"wildcard": {"accountID": {"value": "v*"}}} }postman请求截图: 2、使用Rest接口删除数据 …

re学习(23)BUUCTF 刮开有奖(中间变量的获取)

INT_PTR __stdcall DialogFunc(HWND hDlg, UINT a2, WPARAM a3, LPARAM a4) {const char *v4; // esiconst char *v5; // ediint v7[2]; // [esp8h] [ebp-20030h] BYREF 虽然看名称不连续,但是通过看偏移地址,可知,这些变量在内存中是连续的&…

iOS--属性关键字

定义 chat: 在iOS开发中,属性关键字是用于声明类的属性(实例变量)的修饰符。属性关键字可以影响属性的访问权限、内存管理和生成相关的getter和setter方法。 属性关键字有哪些? 分类属性关键字原子性atomic、nonato…

Android ConstraintLayout使用攻略

原文链接 Android ConstraintLayout使用攻略 ConstraintLayout是新一代的布局,它汲取了众家之长,把布局的概念进行了大统一,灵活且强大,基本上可以干掉以前所有的常用布局(LinearLayout, RelativeLayout和FrameLayout…

SD-WAN的ZTP功能是不用企业再配置了吗?

Zero-Touch Provisioning (全自动服务开通)是SD-WAN方案中最具代表性、也是最能打动客户的功能之一。 ZTP功能是完全不用企业用户进行配置了吗? 其实ZTP(Zero Touch Provisioning)并不是完全不需要配置,而是可以通过预定义的配置和…

【重点:单例模式】特殊类设计

请设计一个类,只能在堆上创建对象 方式如下: 将构造函数设置为私有,防止外部直接调用构造函数在栈上创建对象。向外部提供一个获取对象的static接口,该接口在堆上创建一个对象并返回。将拷贝构造函数设置为私有,并且…

vue中使用tesseract实现OCR/文字识别(识别图片中的文字)

文章目录 tesseract在线使用npm安装依赖:页面引入:js方法: tesseract离线使用克隆仓库拷贝 worker.min.js和tesseract-core.wasm.jsindex.html 引入tesseract.min.js下载语言包文件不上传文件服务器js方法优化 tesseract官网地址:…

webrtc QOS方法二.4(flexfec 实现可优化点)

一、冗余报文和媒体报文组织结构优化点 以单帧10个媒体报文,冗余度20%为例。这里webrtc输出要有10个媒体包2个冗余包。webrtc输出的报文序列如下: 代码实现如下: UlpfecGenerator::AddPacketAndGenerateFec:攒够足够的帧 Forwar…

【Kafka源码走读】Admin接口的客户端与服务端的连接流程

注:本文对应的kafka的源码的版本是trunk分支。写这篇文章的主要目的是当作自己阅读源码之后的笔记,写的有点凌乱,还望大佬们海涵,多谢! 最近在写一个Web版的kafka客户端工具,然后查看Kafka官网,…

Android 屏幕适配各种宽高比的手机

由于android 手机的屏幕宽高比样式太多了,在设计UI时,很多时候,会因为宽高比,分辨率不同会有展示上的差异。 我是这样解决的 在activity的onCreate方法前,调用: fun screenFit(context: Context) {val me…

系统架构设计师-软件架构设计(2)

目录 一、基于架构的软件开发方法(ABSD) 1、架构需求 1.1 需求获取 1.2 标识构件 1.3 架构需求评审 2、架构设计 2.1 提出架构模型 2.2 映射构件 2.3 分析构件的相互作用 2.4 产生架构 2.5 设计评审 3、架构文档化 4、架构复审 5、架构实现 5.1 分析与…