问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

到底什么是Socket?

发布网友 发布时间:2023-01-02 15:29

我来回答

1个回答

热心网友 时间:2023-10-09 17:59

本系列文章前面那些主要讲解的是计算机网络的理论基础,但对于即时通讯IM这方面的应用层开发者来说,跟计算机网络打道的其实是各种API接口。

本篇文章就来聊一下网络应用程序员最熟悉的Socket这个东西,抛开生涩的计算机网络理论,从应用层的角度来理解到底什么是Socket。

对于 Socket 的认识,本文将从以下几个方面着手介绍:

1) Socket 是什么;

2) Socket 是如何创建的;

3) Socket 是如何连接的;

4) Socket 是如何收发数据的;

5) Socket 是如何断开连接的;

6) Socket 套接字的删除等。

特别说明: 本文中提到的“Socket”、“网络套接字”、“套接字”,如无特殊指明,指的都是同一个东西哦。

Socket 是什么

一个数据包经由应用程序产生,进入到协议栈中进行各种报文头的包装,然后操作系统调用网卡驱动程序指挥硬件,把数据发送到对端主机。

我们大家知道,协议栈其实是位于操作系统中的一些协议的堆叠,这些协议包括 TCP、UDP、ARP、ICMP、IP等。即时通讯开发可以找蔚可云开发。

通常某个协议的设计都是为了解决特定问题的,比如:

1) TCP 的设计就负责安全可靠的传输数据;

2) UDP 设计就是报文小,传输效率高;

3) ARP 的设计是能够通过 IP 地址查询物理(Mac)地址;

4) ICMP 的设计目的是返回错误报文给主机;

5) IP 设计的目的是为了实现大规模主机的互联互通。

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

应用程序的下面: 就是操作系统内部,操作系统内部包括协议栈,协议栈是一系列协议的堆叠。

操作系统下面: 就是网卡驱动程序,网卡驱动程序负责控制网卡硬件,驱动程序驱动网卡硬件完成收发工作。

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

这里大家有可能不太清楚所以然,所以我用了一下 netstat 命令来给大伙看一下Socket是啥玩意。

Socket 是如何创建的

通过上节的讲解,现在你可能对 Socket 有了一个基本的认识,先喝口水,休息一下,让我们继续探究 Socket。

现在我有个问题, Socket 是如何创建的呢?

Socket 是和应用程序一起创建的。

应用程序中有一个 socket 组件,在应用程序启动时,会调用 socket 申请创建Socket,协议栈会根据应用程序的申请创建Socket:首先分配一个Socket所需的内存空间,这一步相当于是为控制信息准备一个容器,但只有容器并没有实际作用,所以你还需要向容器中放入控制信息;如果你不申请创建Socket所需要的内存空间,你创建的控制信息也没有地方存放,所以分配内存空间,放入控制信息缺一不可。至此Socket的创建就已经完成了。

Socket创建完成后,会返回一个Socket描述符给应用程序,这个描述符相当于是区分不同Socket的号码牌。根据这个描述符,应用程序在委托协议栈收发数据时就需要提供这个描述符。

Socket 是如何连接的

Socket创建完成后,最终还是为数据收发服务的。但是,在数据收发之前,还需要进行一步“连接”(术语就是 connect),建立连接有一整套过程。

实际上这个“连接”是应用程序通过 TCP/IP 协议标准从一个主机通过网络介质传输到另一个主机的过程。

Socket刚刚创建完成后,还没有数据,也不知道通信对象。

在这种状态下: 即使你让客户端应用程序委托协议栈发送数据,它也不知道发送到哪里。所以浏览器需要根据网址来查询服务器的 IP 地址,查询到目标主机后,再把目标主机的 IP 告诉协议栈。至此,客户端这边就准备好了。

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

现在通信双方建立连接的必要信息已经具备,可以开始“连接”过程了。

首先: 客户端应用程序需要调用 Socket 库中的connect方法,提供 socket 描述符和服务器 IP 地址、端口号。

以下是connect的伪码调用:

1connect(<描述符>、<服务器IP地址和端口号>)

这些信息会传递给协议栈中的 TCP 模块,TCP 模块会对请求报文进行封装,再传递给 IP 模块,进行 IP 报文头的封装,然后传递给物理层,进行帧头封装。

之后通过网络介质传递给服务器,服务器上会对帧头、IP 模块、TCP 模块的报文头进行解析,从而找到对应的Socket。

Socket收到请求后,会写入相应的信息,并且把状态改为正在连接。

请求过程完成后: 服务器的 TCP 模块会返回响应,这个过程和客户端是一样的

Socket 是如何收发数据的

当控制流程上节中的连接过程回到应用程序之后,接下来就会直接进入数据收发阶段。

数据收发操作是从应用程序调用 write 将要发送的数据交给协议栈开始的,协议栈收到数据之后执行发送操作。

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

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

因为只要一旦收到数据就会发送,就有可能发送大量的小数据包,导致网络效率下降(所以协议栈需要将数据积攒到一定数量才能将其发送出去)。

至于协议栈会向缓冲区放多少数据,这个不同版本和种类的操作系统有不同的说法。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? 挂机对手机有没有伤害? vivo息屏挂机会过热吗 磨毛亲肤棉是什么面料 被设置保护状态怎么解除? ASUS型号K42J笔记本电脑的电池在哪个位置? 宜昌渔洋关是最偏僻的县 五峰渔洋关足道正规吗 五峰渔洋关巷子在哪里 五峰渔洋关有哪些KTV好玩点? 就业登记已审核的意思 关于英语方面的(高手进) 花旗参和蟹鱼一起吃 吃西洋叁能吃鱼虾吗 吃花旗参是不是不可以吃青菜跟鱼 喝花旗参泡水能不能吃鱼 求《成功助手》软件的注册激活码...! 求好听的宫斗名必须原创 能推荐一些经典的中国古代电视剧名字,帝王类的如《汉武大帝》、《康熙王朝》等,最好中国每个朝代的都有 美团商家账值钱吗 感统训练一周几次最好 梦见自己穿了件白衬衫 梦见自己穿一件白衬衫 梦见自己身披白衬衫 梦见白衬衫 梦见试穿白衬衫 一年级手工钟表怎么做 如何开一个新的 如何开一个新的 怎么开一个新的 开了微信分身弄了一个,怎么样这个号会信息全部消失 怎么开一个新的 双面胶怎么消除 老熟茶的口感怎样老熟茶口感怎么描述 江苏熟茶口感怎么样 龙园智泡二十年熟茶口感怎么样? 普洱熟茶如何辨别口感 2006年老同志一帆风顺熟茶怎么样 失眠,是一个人的孤独 隆江猪脚饭一句话 一碗隆江正宗猪脚饭下一句