《网络是怎样连接的》(二.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,但这篇博文仍然比较抽象,我看了好多遍才看明白-_-||,为了节省和…

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

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

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

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

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…

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

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

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 分析与…

获取大疆无人机的飞控记录数据并绘制曲线

机型M350RTK,其飞行记录文件为加密的,我的完善代码如下 gitgithub.com:huashu996/DJFlightRecordParsing2TXT.git 一、下载安装官方的DJIFlightRecord git clone gitgithub.com:dji-sdk/FlightRecordParsingLib.git飞行记录文件在打开【我的电脑】&am…

结构型设计模式之装饰器模式【设计模式系列】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列 期待你的关注哦!!! 现在的一切都是为将来的梦想编织翅膀,让梦想在现实中展翅高飞。 Now everythi…

LiveNVR监控流媒体Onvif/RTSP功能-支持无人机、IPC等设备RTMP推流转码分发H5无插件播放也支持GB28181输出

LiveNVR支持无人机、IPC等设备RTMP推流转码分发H5无插件播放也支持GB28181输出 1、无人机推流转国标2、获取RTMP推流地址2.1、RTMP推流地址格式2.2、推流地址示例 2、设备RTMP推流3、配置拉转RTMP3.1、直播流地址格式3.2、直播流地地址示例3.3、通道配置直播流地址 4、配置级联…

深入浅出多种开发语言对接淘宝京东1688阿里巴巴等电商平台,获取实时商品详情数据API接口介绍

api接口详解大全?优秀的设计是产品变得卓越的原因设计API意味着提供有效的接口,可以帮助API使用者更好地了解、使用和集成,同时帮助人们有效地维护它每个产品都需要使用手册,API也不例外在API领域,可以将设计视为服务器和客户端之…

IDE /完整分析C4819编译错误的本质原因

文章目录 概述基本概念代码页标识符字符集和字符编码方案源字符集和执行字符集 编译器使用的字符集VS字符集配置 有何作用编译器 - 源字符集编译器 -执行字符集 Qt Creator下配置MSVC编译器参数动态库DLL字符集配置不同于可执行程序EXE总结 概述 本文将从根本原因上来分析和解…

属猴人性格及一生运势怎么样?

生肖属猴的人聪明,才华出众,是个非常会处理人际关系的生肖, 开朗,大方,人缘好,而且能说会道,嘴巴甜,也特别擅长社交,喜欢热闹, 所以属猴人不管在哪都容易受到…

数仓学习---13、报表数据导出

星光下的赶路人star的个人主页 莫见长安行乐处,空令岁月易蹉跎 文章目录 一、报表数据导出1.1 MySQL建库建表1.1.1 创建数据库1.1.2 创建表 1.2 数据导出1.2.1 DataX配置文件生成脚本1.2.2 编写每日导出脚本 一、报表数据导出 为方便报表应用使用数据,需…