首页 > 其他分享 >委托协议栈发送接受数据响应

委托协议栈发送接受数据响应

时间:2023-12-24 23:02:09浏览次数:41  
标签:Socket 委托 应用程序 发送 响应 服务器 接字 连接 客户端

前景提要

上一篇文章说过网络收发功能是委托操作系统实现的,这里的委托就是指委托操作系统的协议栈,和DNS查询一样,建立连接和通信上层也需要使用到 Socket的,Socket用于提供计算机之间连接通信的管道,大致示意图如下所示:

上图表示收发数据的主要思路,那么要通信就需要先建立这条管道(也叫作连接)。

大致流程:

服务器启动的时候会创建套接字等待客户端连接,客户端在使用网络请求的时候创建套接字;操作系统去连接这两个套接字之间的管道;这样就可以收发数据了;当通信完毕后,服务器\客户端任意一方发起断开连接的请求,双方确认后删除套接字


上面这些操作都是通过Socket程序,可以看到Socket程序是用于连接协议栈和应用的桥梁,也就是Socket委托操作系统的协议栈,协议栈委托网卡,协议栈拿到之后返回socket,socket再返回给调用该函数的调用者

创建套接字

客户端调用Socket库创建套接字(和调用gethostByname一样),协议栈返回一个描述符给应用程序,应用程序保存这个描述符

描述符:用于区分不同的套接字,一台计算机有很多个应用程序,而应用程序又有很多不同的网络连接

对应于图中的1,套接字表示了本地ip地址端口,远端的ip地址端口,链接状态,正在使用这个套接字的应用程序信息。

连接服务器的套接字

使用创建套接字时协议栈返回的描述符和服务器的IP端口填入Socket程序连接方法的参数中,

  • 描述符:协议栈通过描述符来判断使用哪个套接字进行链接操作
  • 服务器IP地址:使用之前讲的通过DNS服务器将服务器域名转换为对应的IP地址
  • 服务器端口:每个网卡(网络连接设备)对应一个ip地址,一台计算机有多个网卡因此会存在多个ip地址,那么端口是什么呢?是具体的通信的应用程序,和客户端一样,找到计算机之后有很多应用程序也有很多连接,但是具体使用服务器的哪个套接字进行连接呢?通过端口号(后面讲)就可以找到服务器通信要使用的是哪个套接字

端口号是提前设定好的,服务器是电子邮件时会使用25号端口;Web访问是使用80号端口

这样,客户端就知道和服务器的哪个套接字进行通信了,但是服务器还不知道和客户端的哪个套接字进行通信,因此在连接的过程中会使用客户端的套接字分配一个端口号告知服务器,这样双方就都知道各自的端口号也就是套接字了

链接成功后,保存对方和自己的ip地址,端口信息还有使用这个套接字的PID应用程序,连接状态等这些信息保存到套接字中

通信阶段

客户端发送数据

通过调用Socket程序的write方法将发送的数据放入这个方法的参数中即可,socket在委托协议栈发送数据,协议栈的TCP/IP模块或者UDP模块在委托网卡将数据切片发送给服务器;

服务器接受数据处理返回信息

服务器收到后也是一样的,通过端口号判断使用的套接字信息取出PID透传给应用程序去处理数据,并准备好处理结果提交给socket,socket利用协议栈,协议栈利用网卡将结果发送到客户端;

客户端读取服务器返回的信息

当客户端调用read方法指定一块数据缓冲区时,服务器返回的数据会写到这块缓冲区中。

断开连接

客户端或者服务端调用close程序进入断开连接阶段,管道会断开连接,套接字删除。

待优化点

每次访问Web时都需要经历这几个阶段并且一个网页中存在图片等信息时都会进行一次这样的操作,性能损耗不说还很浪费时间;因此后面出现了一次连接中可以请求多个信息

标签:Socket,委托,应用程序,发送,响应,服务器,接字,连接,客户端
From: https://blog.51cto.com/u_14689064/8957358

相关文章

  • 策略模式进行发送短信
    业务场景​ 查询数据库的配置表,看配置进行选择不同公司的短信服务代码策略代码//策略接口publicinterfaceSmsSendStrategy{voidsendSms(Stringphone,Stringtemplate,Map<String,String>map);}//腾讯短信实现策略@ComponentpublicclassTencentSmsimpl......
  • HTML学习第三天:探索语义化标签与响应式设计
    在今天的HTML学习中,我进一步了解了语义化标签和响应式设计的重要性。早上,我开始学习语义化标签。这些标签不仅可以定义网页的结构,还能为搜索引擎和辅助技术提供信息。例如,<header>标签用于定义页面的头部,<nav>标签用于定义导航菜单。这些标签不仅提高了代码的可读性,还有助于提高网......
  • 【Spring教程29】Spring框架实战:从零开始学习SpringMVC 之 服务器响应知识全面详解
    目录1环境准备2响应页面3返回文本数据4响应JSON数据5知识点总结欢迎大家回到《Java教程之Spring30天快速入门》,本教程所有示例均基于Maven实现,如果您对Maven还很陌生,请移步本人的博文《如何在windows11下安装Maven并配置以及IDEA配置Maven环境》,本文的上一篇为《SpringMVC......
  • 基于Feigh发送Http请求,替代RestTemplate
    下载依赖<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>需要在启动类上开启配置,Feigh默认自带负载均衡配置@SpringBootApplication@EnableFeignClientspublic......
  • ICEE-SPI-debug最好用 SPI 和 JTAG 或更优的(高达104MHz的)SPI通信保障飞速的debug响
    S25FL032P:32-MbitCMOS3.0VoltFlashMemorywith104-MHzSPI(SerialPeripheralInterface)MultiI/OBusSPANSIONZentelSDRAM;https://www.zerodayinitiative.com/blog/2019/9/2/mindshare-hardware-reversing-with-the-tp-link-tl-wr841n-routerhttps://openw......
  • react Hooks+Context 实现响应式布局
    1.创建文件 viewportContext.tsx importReactfrom"react";constdefaultValue={  width:window.innerWidth}constviewportContext=React.createContext(defaultValue);constViewportProvider=({children})=>{  const[width,setWidt......
  • powershell 作服务端 响应网络(socket tcp)连接 提供文件夹大小查询服务
    包含:端口占用检测心跳包网络断线检测传入的数据是否为合法有效的目录路径检测读取计算文件夹大小(不含软链接|symlink)传回查询到的文件夹大小[cmdletbinding()]Param($Port=8888)$VerbosePreference="Continue"#值或取`SilentlyContinue`,此时需调用脚本时传入`-Ve......
  • C# 获取Http请求服务器响应的cookie
    stringurl="http://localhost:5082/cookie/test2";varcookies=newCookieContainer();varhandler=newHttpClientHandler(){CookieContainer=cookies};HttpClientclient=newHttpClient(handler);Dictionary<string,string>dic=ne......
  • Socket.D 基于消息的响应式应用层网络协议
    首先根据Socket.D官网的副标题,Socket.D的自我定义是:基于事件和语义消息流的网络应用协议。官网定义的特点是:基于事件,每个消息都可事件路由所谓语义,通过元信息进行语义描述流关联性,有相关的消息会串成一个流语言无关,使用二进制输传数据(支持tcp,ws,udp)。支持多语言、......
  • 【网关开发】Openresty使用cosocket API 发送http与tcp网络请求
    背景为网关提供健康检查功能时需要对节点发送http或者tcp探活请求。Openresty提供cosocket来处理非阻塞IO。实现跟工程结合在一起,这里简单拼接数据结构localfunction__default_check_alive(status)returnstatus>=200andstatus<=299endlocalfunctiondebug_c......