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

news2024/11/26 21:20:55

(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.coloradmin.cn/o/778335.html

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

相关文章

文本预处理——文本处理的基本方法

目录 什么是分词jieba分词特性精确模式分词全模式分词搜索引擎模式分词使用用户自定义词典 命名实体识别词性标注 什么是分词 jieba分词特性 精确模式分词 import jieba content工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作 print(jieba.lcut(co…

《零基础入门学习Python》第055讲:论一只爬虫的自我修养3:隐藏

0. 请写下这一节课你学习到的内容:格式不限,回忆并复述是加强记忆的好方式! 上节课我们说过了,有一些网站比较痛恨爬虫程序,它们不喜欢被程序所访问,所以它们会检查链接的来源,如果说来源不是正…

ONGUI

public class ONGUI : MonoBehaviour {private void OnGUI() {GUI.Label(new Rect(0,0,100,250),"ONGUI");} }说明是以左上角为原点来算的

Spring Cloud【服务网关Gateway(三大核心概念、入门案例、路由规则 、Java API构建路由、动态路由、断言功能详解)】(六)

目录 服务网关Gateway_三大核心概念 服务网关Gateway_入门案例 服务网关Gateway_路由规则 服务网关Gateway_Java API构建路由 服务网关Gateway_动态路由 服务网关Gateway_断言功能详解 服务网关Gateway_三大核心概念 路由(Route) 这是网关的基本构建块。它由一个ID&am…

小程序自定义导航栏

效果图 代码 app.json文件下 "window":{"navigationStyle": "custom" //增加此属性},app.js文件 //计算高度 App({onLaunch() {wx.getSystemInfo({ // 获取设备信息success: (res) > {this.globalData.systeminfo res//导航栏let statusB…

springboot整合quartz通过数据库配置任务调度简单办法

简介 Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。在java企业级应用中,Quartz是使用最广泛的定时调度框架。 在Quartz中的主要概念: Scheduler:调度任务…

C语言中文件的读写

不争输赢,只问对错 文章目录 一、文件的概述 二、什么是读写文件 三、文件处理的函数 1.文件的打开与关闭 2.文件的顺序读写 文件的顺序读写相关函数 scanf 和 printf 家族的对比及其区分 3.文件的随机读写 文件的随机读写函数 四、文件缓冲区 五…

【el-tree查询并高亮】vue使用el-tree组件,搜索展开并选中对应节点,高亮搜索的关键字,过滤后高亮关键字,两种方法

第一种(直接展开并高亮关键字) 效果图这样的,会把所有的有这些关键字的节点都展开 代码: 这里的逻辑就是通过递归循环把所有和关键字匹配的节点筛选出来 然后通过setCheckedKeys方法把他展开选中 然后通过filterReal把关键字高亮…

Hadoop——DataGrip连接MySQL|Hive

1、下载 DataGrip下载:DataGrip: The Cross-Platform IDE for Databases & SQL by JetBrains 2、破解 破解链接:https://www.cnblogs.com/xiaohuhu/p/17218430.html 3、启动环境 启动Hadoop:到Hadoop的sbin目录下右键管理员身份运行…

数学建模学习(2):数学建模各类常用的算法全解析

一、评价类算法 常见的评价算法 1.层次分析法 基本思想 是定性与定量相结合的多准则决策、评价方法。将决策的有关元素分解成 目标层、准则层和方案层 ,并通过人们的 判断对决策方案的 优劣进行排序 ,在此基础上进行定性和定量分析。它把人的思维过程…

预处理详解

目录 一、预定义符号 二、#define 1.认识#define 2.使用#define 2.1#define定义常量 2.2#define定义宏 2.3#define的替换规则 三、宏定义的其他内容 1.#和## 1.1# 1.2## 2.宏的副作用 3.宏的命名规则 4.undef 5.条件编译 一、预定义符号 #include<stdio.h> int…

通过FPGA实现基于RS232串口的指令发送并控制显示器中目标位置

目录 1.算法理论概述 串口通信模块 指令解析模块 位置控制模块 显示器驱动模块 2.部分核心程序 3.算法运行软件版本 4.算法运行效果图预览 5.算法完整程序工程 1.算法理论概述 通过FPGA实现基于RS232串口的指令发送并控制显示器中目标位置是一种常见的应用场景&#x…

双向不循环链表的认识和基础操作(节点创建,头插头删,尾插尾删,输出和逆置)

头定义&#xff1a; typedef char datatype[20];//datatypechar[20] typedef struct Node {//数据域 数据元素datatype data;//指针域 下一个节点地址struct Node* next;//指针域 上一个节点地址struct Node* prev; }*DoubleLink; 创建节点&#xff1a; DoubleLink create_n…

校园电气安全风险分析及预防措施 安科瑞 许敏

摘要:校园属于人员密集场所&#xff0c;若安全风险排查、管控不到位&#xff0c;可能导致安全事故发生&#xff0c;造成严重事故后果。校园电气设备设施引起的电气火灾和触电等事故&#xff0c;是构成校园安全威胁之一&#xff0c;笔者通过对校园发生的电气安全事故案例原因分析…

一次线上OOM问题的个人复盘

我们一个java服务上线后&#xff0c;偶尔会发生内存OOM(Out Of Memory)问题&#xff0c;但由于OOM导致服务不响应请求&#xff0c;健康检查多次不通过&#xff0c;最后部署平台kill了java进程&#xff0c;这导致定位这次OOM问题也变得困难起来。 最终&#xff0c;在多次review代…

react目录结构

比较全面的react目录结构。 目录详解 assets&#xff1a;放置原始资源文件。 components&#xff1a;存放全局组件。 contants&#xff1a;常量文件夹&#xff0c;存放常量。 i18n&#xff1a;i18n国际化&#xff0c;各种语言的翻译。 pages&#xff1a;页面文件夹。 r…

es添加索引命令行和浏览器添加索引--图文详解

一、添加索引 创建索引 curl -X PUT "localhost:9200/my-index-00001?pretty" 获取索引 curl -X GET "localhost:9200/my-index-000001?pretty" 获取全部的索引 curl -X GET "http://localhost:9200/_cat/indices?v" 获取索引映射 cur…

2023 Pycharm 给项目配置解释器 基于已经创建的conda虚拟环境

我在2019年开始使用Pycharm作为python的IDE&#xff0c;最近配置解释器时&#xff0c;法线网上的方法大概过时了&#xff0c;自己尝试了好多次才发现新版本的Pycharm的解释配置方法&#xff0c;故记于此 背景描述&#xff1a; 我是用conda管理环境的&#xff0c;我已经创建好一…

C++ 单例模式(介绍+实现)

文章目录 一. 设计模式二. 单例模式三. 饿汉模式四. 懒汉模式结束语 一. 设计模式 单例模式是一种设计模式 设计模式(Design Pattern)是一套被反复使用&#xff0c;多数人知晓的&#xff0c;经过分类的&#xff0c;代码设计经验的总结。 为什么要有设计模式 就像人类历史发展会…

Docker容器网络和资源管理控制

Docker容器网络 一、Docker 网络实现原理二、Docker 的网络模式网络模式详解&#xff1a;①host模式②container模式③none模式④bridge模式⑤自定义网络 三、资源控制Ⅰ、CPU资源控制Ⅱ、对内存使用的限制Ⅲ、对磁盘IO配额控制&#xff08;blkio&#xff09;的限制 一、Docker…