首页 > 其他分享 >什么是Socket?

什么是Socket?

时间:2024-04-02 19:46:43浏览次数:28  
标签:协议 Socket IP 什么 TCP 应用程序 数据 客户端

Socket是什么以及它的创建过程

OSI七层模型
上三层(会话/表示/应用):HTTP/FTP协议等——数据
传输层: TCP协议/UDP协议——数据 TCP/IP(HEAD) 段
网络层: IP/ICMP/ARP/RARP协议——数据 TCP/IP(HEAD) IP(HEAD) 包
数据链路层:ppp点到点—— 数据 TCP/IP(HEAD) IP(HEAD) 帧
物理层: 111111111111000000000000000011 比特

  • 报文:是网络中交换与传输的数据单元,即站点一次性要发送的数据块。报文包含了将要发送的完整的数据信息,其长短很不一致,长度不限且可变。

一个数据包经由应用程序产生,进入到协议栈中进行各种报文头的包装,然后操作系统调用网卡驱动程序指挥硬件,把数据发送到对端主机。协议栈其实是位于操作系统的一些协议的堆叠,这些协议包括TCP、UDP、ARP、ICMP、IP等。通常某个协议的设计都是为了解决某些问题,比如 TCP 的设计就负责安全可靠的传输数据,UDP 设计就是报文小,传输效率高,ARP 的设计是能够通过 IP 地址查询物理(Mac)地址,ICMP 的设计目的是返回错误报文给主机,IP 设计的目的是为了实现大规模主机的互联互通。

应用程序比如浏览器、电子邮件、文件传输服务器等产生的数据,会通过传输层协议进行传输,而应用程序是不会和传输层直接建立联系的,而是有一个能够连接应用层和传输层之间的套件,这个套件就是 Socket

应用程序的下面就是操作系统内部,操作系统内部包括协议栈,协议栈是一系列协议的堆叠。操作系统下面就是网卡驱动程序,网卡驱动程序负责控制网卡硬件,驱动程序驱动网卡硬件完成收发工作。

在操作系统内部有一块用于存放控制信息的存储空间,这块存储空间记录了用于控制通信的控制信息。其实这些控制信息就是 Socket 的实体,或者说存放控制信息的内存空间就是套接字的实体。

套接字连接
套接字创建完成后,最终还是为数据收发服务的,在数据收发之前,还需要进行一步connect,也就是建立连接的过程。这个连接并不是真实的连接,而是应用程序通过TCP/IP标准从一个主机通过网络介质传输到另一个主机的过程。

套接字刚刚创建完成后,还没有数据,也不知道通信对象,在这种状态下,即使你让客户端应用程序委托协议栈发送数据,它也不知道发送到哪里。所以浏览器需要根据网址来查询服务器的 IP 地址,做这项工作的协议是 DNS,查询到目标主机后,再把目标主机的 IP 告诉协议栈,至此,客户端这边就准备好了。

在服务器上,与客户端一样也需要创建套接字,但是同样的它也不知道通信对象是谁,所以我们需要让客户端向服务器告知客户端的必要信息:IP 地址和端口号。

现在通信双方建立连接的必要信息已经具备,只欠一股东南风了。通信双方收到数据之后,还需要一块位置来存放,这个位置就是缓冲区,它是内存的一部分,有了缓冲区,就能够进行数据的收发操作了。

那么现在客户端如果需要给服务端发送一条数据该怎么办??

首先客户端应用程序调用Socket库中的 connect 方法,提供 socket 描述符和服务器 IP 地址、端口号。
这些信息会传递给协议栈中的 TCP 模块,TCP 模块会对请求报文进行封装,再传递给 IP 模块,进行 IP 报文头的封装,然后传递给物理层,进行帧头封装,之后通过网络介质传递给服务器,服务器上会对帧头、IP 模块、TCP 模块的报文头进行解析,从而找到对应的套接字,套接字收到请求后,会写入相应的信息,并且把状态改为正在连接。请求过程完成后,服务器的 TCP 模块会返回响应,这个过程和客户端是一样的(如果大家不太清楚报文头的封装过程,可以阅读笔者的这篇文章 [https://www.cnblogs.com/wuhaoxin/p/18109054](TCP/IP 基础知识总结))
在一个完整的请求和响应过程中,控制信息起到非常关键的作用(具体的作用我们后面会说)。

  • SYN 就是同步的缩写,客户端会首先发送 SYN 数据包,请求服务端建立连接。
  • ACK 就是相应的意思,它是对发送 SYN 数据包的响应。
  • FIN 是终止的意思,它表示客户端/服务器想要终止连接。
    由于网络环境的复杂多变,经常会存在数据包丢失的情况,所以双方通信时需要相互确认对方的数据包是否已经到达,而判断的标准就是 ACK 的值。

当所有建立连接的报文都能够正常收发之后,此时套接字就已经进入可收发状态了,此时可以认为用一根管理把两个套接字连接了起来。当然,实际上并不存在这个管子。建立连接之后,协议栈的连接操作就结束了,也就是说 connect 已经执行完毕,控制流程被交回给应用程序。

收发数据
当控制流程从 connect 回到应用程序之后,接下来就会直接进入数据收发阶段,数据收发操作是从应用程序调用 write 将要发送的数据交给协议栈开始的,协议栈收到数据之后执行发送操作。

协议栈不会关心应用程序传输过来的是什么数据,因为这些数据最终都会转换为二进制序列,协议栈在收到数据之后并不会马上把数据发送出去,而是会将数据放在发送缓冲区,再等待应用程序发送下一条数据。

为什么收到数据包不会直接发送出去,而是放在缓冲区中呢?

因为只要一旦接受到数据就发送,很有可能发送大量小数据包,导致网络效率下降。所以协议栈需要将数据积攒到一定数量才能将其发送出去。置于协议栈会向缓冲区放多少数据,这个不同版本和种类的操作系统有不同的说法,不过所以操作系统和种类都会遵循以下几个标准:

  • 第一个判断要素是每个网络包能够容纳的数据长度,判断的标准是MTU,它表示的是一个网络包的最大长度。最大长度包含头部,所以如果单论数据区的话,就会用MTU-包头长度,由此得出的最大数据长度被称为MSS。

  • 另一个判断标准是时间,当应用程序产生的数据较少时,协议栈向缓冲区放置数据效率不高时,如果每次都等到 MSS 再发送的话,可能因为等待时间太长造成延迟,在这种情况下,即使数据长度没有到达 MSS,也应该把数据发送出去。

假设我们使用的是长度有限法则,此时缓冲区已满,协议栈要发送数据了,协议栈刚要把数据发送出去,却发现无法一次性传输这么大数据量(相对的)的数据,那怎么办呢?

在这种情况下,发送缓冲区中的数据就会超过 MSS 的长度,发送缓冲区中的数据会以 MSS 大小为一个数据包进行拆分,拆分出来的每块数据都会加上 TCP,IP,以太网头部,然后被放进单独的网络包中。

断开连接
当通信双方不再需要收发数据时,需要断开连接。不同的应用程序断开连接的时机不同。以 Web 为例,浏览器向 Web 服务器发送请求消息,Web 服务器再返回响应消息,这时收发数据就全部结束了,服务器可能会首先发起断开响应,当然客户端也有可能会首先发起(谁先断开连接是应用程序做出的判断),与协议栈无关。
无论哪一方发起断开连接的请求,都会调用 Socket 库的 close 程序。我们以服务器断开连接为例,服务器发起断开连接请求,协议栈会生成断开连接的 TCP 头部,其实就是设置 FIN 位,然后委托 IP 模块向客户端发送数据,与此同时,服务器的套接字会记录下断开连接的相关信息

标签:协议,Socket,IP,什么,TCP,应用程序,数据,客户端
From: https://www.cnblogs.com/wuhaoxin/p/18108832

相关文章

  • 构造函数init到底是什么作用 是下面的方法都可以从init里面获取参数吗?(AI+Python)
    大家好,我是Python进阶者。一、前言前几天在Python白银交流群【无敌劈叉小狗】问了一个Python基础的问题,问题如下:问一下构造函数init到底是什么作用是下面的方法都可以从init里面获取参数吗?二、实现过程这里【黄志诚】分享了自己的一个经验:全局呀,相当于初始化一个参数,全局都......
  • 氟碳喷涂和与粉末喷涂的区别,PVDF氟碳涂覆技术具体是什么
    静电喷涂分:粉沫喷涂和氟碳喷涂,粉沫喷涂的原料为:聚氨脂、聚氨树脂、环氧树脂、羟基聚脂树脂以及环氧/聚酯树脂,可配制多种颜色。粉沫喷涂的特点:喷涂设备有手工的,有自动吊挂式、施工简单、涂层厚度为30微米以上,抗冲击,耐磨擦,防腐蚀,耐候性等均好,涂料价格比氟碳便宜。粉沫喷涂最大弱点......
  • 被 AI 写的游戏代码砸中是什么感觉 | 10 分钟打造你的超级 AI 编码助手
    近年来,人工智能得到了迅猛的发展,并在各行各业都得到了广泛应用。尤其是近两年来,AI开发工具逐渐成为开发者们的新宠,其中通义灵码(阿里云发布的一款基于通义大模型的AI编码助手)更是引发了无限可能性的探索。截至目前,通义灵码下载量已经突破100万。是国内使用率最高的AI编码助手......
  • 氟碳漆与氟碳喷涂有什么区别和不同之处
    首先,氟碳漆与氟碳喷涂两者根本不是一个概念,氟碳漆是一种常温自干性的油漆,适用于外墙铝板、钢结构的防腐涂装,是目前综合性能最出色的涂料之一,而氟碳喷涂则是一种静电喷涂,属于高档次喷涂,因此价格较高。氟碳喷涂具有优异的抗褪色性、抗起霜性、抗大气污染(酸雨等)的腐蚀性,抗紫外线能......
  • 什么是App分发?那些分发平台可以选择?
    App分发指的是将开发完成的应用程序(App)推广和发布到用户可以下载和安装的渠道,以达到更广泛的用户群体,提高应用的知名度和受欢迎程度。这个过程对于开发者来说至关重要,因为它是推广和营销的重要手段之一。App分发的意义在于,让用户能够方便地找到、下载和使用自己需要的App。通过分......
  • 为什么要开展业务串讲?
    知识星球有同学问了这样一个问题:质量团队组织业务串讲,如何开展?如何梳理和演讲业务需求?很少见的一个好问题,也是很多测试团队忽视的点。但恰恰是业务串讲,其背后蕴含着深刻的逻辑,同时对测试团队拥有巨大的好处。 在招聘环节,在其他条件类似的情况下,企业往往更青睐于那些有类似业......
  • 面向对象12:什么是多态?
    packagecom.oop.demo06;publicclassStudentextendsPerson{publicvoidrun(){System.out.println("son");}publicvoideat(){System.out.println("eat");}}/*多态注意事项:1.多态是方法的多态,属性没有多态2.父类和子类,有......
  • oracle组合索引什么情况下生效?
    Oracle组合索引(compositeindex)是指在数据库表的多个列上创建的索引。当查询操作中涉及到这些列并且是组合索引的前导列时,组合索引会生效。组合索引的前导列是指在索引中排在最前面的列。只有当查询的条件中使用了组合索引的前导列,且查询条件满足以下特性时,组合索引才会生效:......
  • 什么是gif? 如何把视频格式转成gif动图格式?展现动图的魅力
    一,什么是gif格式gif是一种位图图形文件格式,主要用于显示索引彩色图像。gif格式在1987年由CompuServe公司开发,它采用LZW(Lempel-Ziv-Welch)无损压缩算法,这种算法可以有效地减少图像文件在网络上传输的时间。GIF格式的特点包括支持透明背景图像,可以显示多达256种不同的颜色。G......
  • nodejs websocket
    github:库地址node后端:interfacemsgType{from:string;to:string;msg:string;}exportclassServer{privatews=require("nodejs-websocket");privateconnections:{nickname:string;con:any}[]=[];constructor(){this.sta......