范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

原来这才是Socket

  关于对 Socket 的认识,大致分为下面几个主题,Socket 是什么,Socket 是如何创建的,Socket 是如何连接并收发数据的,Socket 套接字的删除等。 Socket 是什么以及创建过程
  一个数据包经由应用程序产生,进入到协议栈中进行各种报文头的包装,然后操作系统调用网卡驱动程序指挥硬件,把数据发送到对端主机。整个过程的大体的图示如下。
  我们大家知道,协议栈其实是位于操作系统中的一些协议的堆叠,这些协议包括  TCP、UDP、ARP、ICMP、IP 等。通常某个协议的设计都是为了解决某些问题,比如 TCP 的设计就负责安全可靠的传输数据,UDP 设计就是报文小,传输效率高,ARP 的设计是能够通过 IP 地址查询物理(Mac)地址,ICMP 的设计目的是返回错误报文给主机,IP 设计的目的是为了实现大规模主机的互联互通。
  应用程序比如浏览器、电子邮件、文件传输服务器等产生的数据,会通过传输层协议进行传输,而应用程序是不会和传输层直接建立联系的,而是有一个能够连接应用层和传输层之间的套件,这个套件就是  Socket  。
  在上面这幅图中,应用程序包含 Socket 和解析器,解析器的作用就是向 DNS 服务器发起查询,查询目标 IP 地址。
  应用程序的下面就是操作系统内部,操作系统内部包括协议栈,协议栈是一系列协议的堆叠。操作系统下面就是网卡驱动程序,网卡驱动程序负责控制网卡硬件,驱动程序驱动网卡硬件完成收发工作。
  在操作系统内部有一块用于存放控制信息的存储空间,这块存储空间记录了用于控制通信的控制信息。 其实这些控制信息就是 Socket 的实体,或者说存放控制信息的内存空间就是套接字的实体 。
  这里大家有可能不太清楚所以然,所以我用了一下 netstat 命令来给大伙看一下套接字是啥玩意。
  我们在 Windows 的命令提示符中输入 netstat -ano  # netstat 用于显示套接字内容 , -ano 是可选选项 # a 不仅显示正在通信的套接字,还显示包括尚未开始通信等状态的所有套接字 # n 显示 IP 地址和端口号 # o 显示套接字的程序 PID
  我的计算机会出现下面结果。
  图中的每一行都相当于一个套接字,每一列也被称为一个元组,所以一个套接字就是五元组(协议、本地地址、外部地址、状态、PID)。有的时候也被叫做四元组,四元组不包括协议。
  比如图中的第一行,它的协议就是 TCP,本地地址和远程地址都是 0.0.0.0,这表示通信还没有开始,IP 地址暂时还未确定,而本地端口已知是 135,但是远程端口还未知,此时的状态是  LISTENING  ,LISTENING 表示应用程序已经打开,正在等待与远程主机建立连接(关于各种状态之间的转换,大家可以阅读笔者的这篇文章 TCP ,丫的终于来了!!)最后一个元组是 PID,即进程标识符,PID 就像我们的身份证号码,能够精确定位唯一的进程。
  现在你可能对 Socket 有了一个基本的认识,现在喝口水,休息一下,让我们继续探究 Socket。
  现在我有个问题,Socket 是如何创建的呢?
  Socket 是和应用程序一起创建的。应用程序中有一个 socket 组件,在应用程序启动时,会调用 socket 申请创建套接字,协议栈会根据应用程序的申请创建套接字:首先分配一个套接字所需的内存空间,这一步相当于是为控制信息准备一个容器,但只有容器并没有实际作用,所以你还需要向容器中放入控制信息;如果你不申请创建套接字所需要的内存空间,你创建的控制信息也没有地方存放,所以 分配内存空间,放入控制信息缺一不可 。至此套接字的创建就已经完成了。
  套接字创建完成后,会返回一个 套接字描述符 给应用程序,这个描述符相当于是区分不同套接字的号码牌。根据这个描述符,应用程序在委托协议栈收发数据时就需要提供这个描述符。 套接字连接
  套接字创建完成后,最终还是为数据收发服务的,在数据收发之前,还需要进行一步  connect  ,也就是建立连接的过程。这个连接并不是真实的连接:用一根水管插在两个电脑之间。
  而是应用程序通过 TCP/IP 协议标准从一个主机通过网络介质传输到另一个主机的过程。
  套接字刚刚创建完成后,还没有数据,也不知道通信对象。在这种状态下,即使你让客户端应用程序委托协议栈发送数据,它也不知道发送到哪里。所以浏览器需要根据网址来查询服务器的 IP 地址,做这项工作的协议是 DNS,查询到目标主机后,再把目标主机的 IP 告诉协议栈,至此,客户端这边就准备好了。
  在服务器上,与客户端一样也需要创建套接字,但是同样的它也不知道通信对象是谁,所以我们需要让客户端向服务器告知客户端的必要信息: IP 地址和端口号 。
  现在通信双方建立连接的必要信息已经具备,只欠一股东南风了。通信双方收到数据之后,还需要一块 位置  来存放,这个位置就是缓冲区,它是内存的一部分,有了缓冲区,就能够进行数据的收发操作了。
  OK,现在客户端想要给服务器发送一条数据,该进行哪些操作呢?
  首先,客户端应用程序需要调用  Socket   库中的 connect 方法,提供 socket 描述符和服务器 IP 地址、端口号。connect(<描述符>、<服务器IP地址和端口号>)
  这些信息会传递给协议栈中的 TCP 模块,TCP 模块会对请求报文进行封装,再传递给 IP 模块,进行 IP 报文头的封装,然后传递给物理层,进行帧头封装,之后通过网络介质传递给服务器,服务器上会对帧头、IP 模块、TCP 模块的报文头进行解析,从而找到对应的套接字,套接字收到请求后,会写入相应的信息,并且把状态改为正在连接。请求过程完成后,服务器的 TCP 模块会返回响应,这个过程和客户端是一样的(如果大家不太清楚报文头的封装过程,可以阅读笔者的这篇文章 TCP/IP 基础知识总结)
  在一个完整的请求和响应过程中,控制信息起到非常关键的作用(具体的作用我们后面会说)。 SYN 就是同步的缩写,客户端会首先发送 SYN 数据包,请求服务端建立连接。 ACK 就是相应的意思,它是对发送 SYN 数据包的响应。 FIN 是终止的意思,它表示客户端/服务器想要终止连接。
  由于网络环境的复杂多变,经常会存在数据包丢失的情况,所以双方通信时需要相互确认对方的数据包是否已经到达,而判断的标准就是 ACK 的值。
  (通信双方连接的建立会经过三次握手流程,对三次握手详细的介绍可以阅读笔者的这篇文章 TCP 基础知识)
  当所有建立连接的报文都能够正常收发之后,此时套接字就已经进入可收发状态了,此时可以认为用一根管理把两个套接字连接了起来。当然,实际上并不存在这个管子。建立连接之后,协议栈的连接操作就结束了,也就是说 connect 已经执行完毕,控制流程被交回给应用程序。 收发数据
  当控制流程从 connect 回到应用程序之后,接下来就会直接进入数据收发阶段,数据收发操作是从应用程序调用 write 将要发送的数据交给协议栈开始的,协议栈收到数据之后执行发送操作。
  协议栈不会关心应用程序传输过来的是什么数据,因为这些数据最终都会转换为二进制序列,协议栈在收到数据之后并不会马上把数据发送出去,而是会将数据放在 发送缓冲区 ,再等待应用程序发送下一条数据。
  为什么收到数据包不会直接发送出去,而是放在缓冲区中呢?
  因为只要一旦收到数据就会发送,就有可能发送大量的小数据包,导致网络效率下降。所以协议栈需要将数据积攒到一定数量才能将其发送出去。至于协议栈会向缓冲区放多少数据,这个不同版本和种类的操作系统有不同的说法,不过,所有的操作系统和种类都会遵循下面这几个标准: 第一个判断要素是每个网络包能够容纳的数据长度,判断的标准是  MTU  ,它表示的是一个网络包的最大长度。最大长度包含头部,所以如果单论数据区的话,就会用 MTU - 包头长度,由此的出来的最大数据长度被称为 MSS  。
  另一个判断标准是时间,当应用程序产生的数据比较少,协议栈向缓冲区放置数据效率不高时,如果每次都等到 MSS 再发送的话,可能因为等待时间太长造成延迟,在这种情况下,即使数据长度没有到达 MSS,也应该把数据发送出去。
  协议栈并没有告诉我们怎样平衡这两个因素,如果数据长度优先,那么效率有可能比较低;如果时间优先,那又会降低网络的效率。
  经过了一段时间…
  假设我们使用的是长度有限法则,此时缓冲区已满,协议栈要发送数据了,协议栈刚要把数据发送出去,却发现无法一次性传输这么大数据量(相对的)的数据,那怎么办呢?
  在这种情况下,发送缓冲区中的数据就会超过 MSS 的长度,发送缓冲区中的数据会以 MSS 大小为一个数据包进行拆分,拆分出来的每块数据都会加上 TCP,IP,以太网头部,然后被放进单独的网络包中。
  到现在,网络包已经准备好发往服务器了,但是数据发送操作还没有结束,因为服务器还未确认是否已经收到网络包。因此在客户端发送数据包之后,还需要服务器进行确认。
  TCP 模块在拆分数据时,会计算出网络包偏移量,这个偏移量就是相对于数据从头开始计算的第几个字节,并将算好的字节数写在 TCP 头部,TCP 模块还会生成一个网络包的序号(SYN),这个序号是唯一的,这个序号就是用来让服务器进行确认的。
  服务器会对客户端发送过来的数据包进行确认,确认无误之后,服务器会生成一个序号和确认号(ACK)并一起发送给客户端,客户端确认之后再发送确认号给服务器。
  我们来看一下实际的工作过程。
  首先,客户端在连接时需要计算出序号初始值,并将这个值发送给服务器。接下来,服务器通过这个初始值计算出 确认号并返回给客户端。初始值在通信过程中有可能会丢弃,因此当服务器收到初始值后需要返回确认号用于确认。同时,服务器也需要计算出从服务器到客户端方向的序号初始值,并将这个值发送给客户端。然后,客户端也需要根据服务器发来的初始值计算出确认号发送给服务器,至此,连接建立完成,接下来就可以进入数据收发阶段了。
  数据收发阶段中,通信双方可以同时发送请求和响应,双方也可以同时对请求进行确认。
  请求 - 确认机制非常强大,通过这一机制,我们可以确认接收方有没有收到某个包,如果没有收到则重新发送,这样一来,但凡网络中出现的任何错误,我们都可以即使发现并补救。
  网卡、集线器、路由器 都没有错误补救机制,一旦检测到错误就会直接丢弃数据包,应用程序也没有这种机制,起作用的只是 TCP/IP 模块。
  由于网络环境复杂多变,所以数据包会存在丢失情况,因此发送序号和确认号也存在一定规则,TCP 会通过窗口管理确认号,我们这篇文章不再赘述,大家可以阅读笔者的这篇文章 TCP 基础知识 来寻找答案。 断开连接
  当通信双方不再需要收发数据时,需要断开连接。不同的应用程序断开连接的时机不同。以 Web 为例,浏览器向 Web 服务器发送请求消息,Web 服务器再返回响应消息,这时收发数据就全部结束了,服务器可能会首先发起断开响应,当然客户端也有可能会首先发起(谁先断开连接是应用程序做出的判断),与协议栈无关。
  无论哪一方发起断开连接的请求,都会调用 Socket 库的 close 程序。我们以服务器断开连接为例,服务器发起断开连接请求,协议栈会生成断开连接的 TCP 头部,其实就是设置 FIN 位,然后委托 IP 模块向客户端发送数据,与此同时, 服务器的套接字会记录下断开连接的相关信息 。
  收到服务器发来 FIN 请求后,客户端协议栈会将套接字标记为断开连接状态,然后,客户端会向服务器返回一个确认号,这是断开连接的第一步,在这一步之后,应用程序还会调用 read 来读取数据。等到服务器数据发送完成后,协议栈会通知客户端应用程序数据已经接收完毕。
  只要收到服务器返回的所有数据,客户端就会调用 close 程序来结束收发操作,这时客户端会生成一个 FIN 发送给服务器,一段时间后服务器返回 ACK 号,至此,客户端和服务器的通信就结束了。 删除套接字
  通信完成后,用来通信的套接字就不再会使用了,此时我们就可以删除这个套接字了。不过,这时候套接字不会马上删除,而是等过一段时间再删除。
  等待这段时间是为了防止误操作,最常见的误操作就是客户端返回的确认号丢失,至于等待多长时间,和数据包重传的方式有关。

苹果搞自研,供应链遭殃!这些半导体厂商或最危险近期,苹果自研射频和基带芯片的相关传闻频上热搜,自A系列芯片尝到了自研甜头以来,苹果这只万亿巨兽似乎已经在自研这条道路上步步逼近。5G射频芯片处理器芯片和基带芯片是手机中非常重要的山西省第一片碳化硅芯片诞生2月25日下午,中国电子科技集团第二研究所通过本报发布山西省第一片碳化硅芯片研制成功。碳化硅具备高禁带宽度高热导率高击穿场强高电子饱和漂移速率等优点,可有效突破传统硅基材料的物理极Prometheus之Dockerfile编写镜像构建容器启动从官方镜像启动promprometheus拉取镜像dockerpullpromprometheus启动容器方式1dockerruntdp90909090nameprometheus中国移动研究院发布多项6G协同创新成果中新财经2月25日电(记者刘育英)2月25日,中国移动研究院以线上形式发布了多项6G协同创新成果,其中包括了几项元宇宙相关成果,如元宇宙技术概述元宇宙云端三维重建元宇宙AR骑行。中想要更换人像照片的背景,有什么简单快速的方法?想要更换人像照片的背景,有什么简单快速的方法?谢谢邀请!更换人物照片背景,可能是很多朋友的一个需求,希望通过这种后期的方式来让拍摄的人物照片获得不同的背景变化,并能够带了更多的效果阿里系和腾讯系在未来十年竞争中谁更占据优势?首先阿里巴巴与腾讯单独对比阿里巴巴更强大!阿里巴巴国际站,速卖通,阿里云,菜鸟,饿了么,盒马,淘宝直播,淘宝特价版等都是增长迅速!腾讯社交受脸书之困没有国际份额,腾讯游戏也受到脸书为什么现在出的一些笔记本都是高处理器低显卡?MX250就被大量使用,MX250能玩战争雷霆吗?MX250和MX150一般都被用在轻薄本超极本办公本里面!但是为什么会用MX250呢?因为其厚度小功耗低显存大等特点,所以众多笔记本电脑生产厂商不约而同的选择了MX250这款显卡,浙江小伙仓库创业,掌握全球80市场份额,被称中国版乔布斯前言在很多人的印象中,全球范围高科技技术领域,我们的企业通常都是陪跑者或者追赶者的角色。近年来,随着我国现代化科技创新型企业的快速崛起,一些科技公司已经开始走在了世界的前列,成了全抢不到冰墩墩?换上移动全光WIFI祝贺北京2022冬奥会圆满落幕,取得佳绩的同时也向全世界展示了我们强大的文化魅力和科技实力,点燃了中华民族的文化自信。说起北京2022冬奥会,那就不得不说在冬奥会期间,全世界朋友心元宇宙与宇宙元元宇宙是人类用数字构建的世界,宇宙元是人类生活的世界是由数字构建的。比如此刻,我眼前有一条河流,岸边是一排栏杆,我手扶着栏杆渺望着河流,树上有一只喜鹊在喳喳随意叫着,它眼里看到河流FindX5的AI跑分全球第一,天玑9000实在太猛了2月25日消息,OPPO在昨晚正式发布了Find系列旗舰OPPOFindX5FindX5Pro和FindX5Pro天玑版。后者还首发搭载了联发科新一代高端处理器天玑9000,首次为
天玑700处理器,6400万像素22。5w超级快充,猜猜这是什么手机?本期的带来的是来自荣耀数字系列的新成员荣耀20SE外观20SE的外观看上去还是平平无奇,在配色上有钛空银经典的幻夜黑蓝水翡翠樱粉金。在厚度和重量上,分别为8。4mm和179g,都还还不给你的华为手机升级HarmonyOS?HarmongyOS是华为新一代的智能终端操作系统,类似于安卓系统。升级的用户已经突破了1000万了。那么有些人会问如何从旧系统升级为HarmonyOS呢。下面就由我给大家讲解一下27万的ModelY上市!老车主又哭了7月8日,特斯拉在其官网公布了ModelY的标准续航后驱版,补贴后的售价为27。6万元,这也是目前ModelY车系里,唯一一辆售价低于30万的车型,而且还是目前特斯拉在国内第2便宜工信部出手!68家巨头已关闭开屏广告,体验前所未有的清爽天天和手机黏在一起的各位,估计对各大APP的开屏广告已经见惯不惊了。不知从什么时候开始,日常使用的绝大多数APP都会在开启时加入5秒左右的开屏广告。而且广告不仅时间长,跳过的按钮往越来越自信了!华为新机已官宣,搭载高通芯片并适配鸿蒙系统从时间节点看,华为运回最后一批麒麟芯片的时间,至今已经过去将近10个月。但是在这10个月当中,华为方面因为禁令的干扰,不仅芯片用一片少一片,而且海外市场和国内市场,手机业务均遭受了小米拍照神机确认回归!和小米MIX4一同发布首发12倍光学变焦在2018年10月的小米MIX3发布会上,雷军首次公开谈论小米和华为的差距。他表示华为手机之所以这么牛,强悍拍照功能是华为绝对的杀手锏。华为手机尤其是旗舰机型的拍照水平完全是独一档华为鸿蒙新一批升级机型曝光nova5等在列今天华为nova5nova5iPronova5z手机迎来鸿蒙HarmonyOS2公测升级,这些之前已经通过了内测的升级,不少用户已提前体验到HarmonyOS系统。值得一提的是,n江汽集团新能源汽车产业的先行者安徽日报媒体观察作为我国新能源汽车产业的先行者,江汽集团通过14年九代技术四代产品迭代,形成了国内领先国际先进的电动车技术平台,产品安全可靠值得信赖,累计示范推广超17万辆新能源汽华为鸿蒙用户突破3000万,为什么其他国产手机厂商不支持鸿蒙最近的鸿蒙UX设计沟通会上华为官方表示目前鸿蒙系统的用户已突破3000万用户,从目前的用户人数上来看,已超过微软的手机操作系统,是全球仅次于安卓和iOS的第三大操作系统。鸿蒙系统突手机配置,价格差不多的情况下,选vivo还是OPPO好?感谢您的阅读!在目前来看,vivo手机的优势确实比OPPO更强一些,怎么说呢?我们通过一些简单的对比就能知道。更多的选择。vivo手机的产品数量确实更多一些,实际上手机产品数量多,日本那么强,为什么日本生产的手机在中国几乎无人问津?美国也很强,生产的电视机有几个国人用过,甚至我都不知道美国有没有自己的电视机品牌和产业。世界上有很多工业化的国家,拥有独立完善工业体系的国家只有极少数几个,其中就有中国和美国。中国