什么是套接字?Socket基本介绍

什么是套接字?Socket基本介绍

  • 一、什么是套接字?
  • 二、套接字特性
  • 三、套接字缓冲区

一、什么是套接字?

套接字是一种通信机制(通信的两方的一种约定),socket屏蔽了各个协议的通信细节,提供了tcp/ip协议的抽象,对外提供了一套接口,同过这个接口就可以统一、方便的使用tcp/ip协议的功能。这使得程序员无需关注协议本身,直接使用socket提供的接口来进行互联的不同主机间的进程的通信。我们可以用套接字中的相关函数来完成通信过程。
在这里插入图片描述
发送方的发送数据的处理流程大致为:用户空间 -> 内核 -> 网卡 -> 网络

在用户态空间,调用发送数据接口 send/sento/wirte 等写数据包,在内核空间会根据不同的协议走不同的流程。以TCP为例,TCP是一种流协议,内核只是将数据包追加到套接字的发送队列中,真正发送数据的时刻,则是由TCP协议来控制的。TCP协议处理完成之后会交给IP协议继续处理,最后会调用网卡的发送函数,将数据包发送到网卡。

接收方的接收数据的处理流程大致为:网络 -> 网卡 -> 内核(epoll等) -> 进程(业务处理逻辑)

网卡会通过轮询或通知的方式接收数据,Linux做了优化,组合了通知和轮询的机制,简单来说,在CPU响应网卡中断时,不再仅仅是处理一个数据包就退出,而是使用轮询的方式继续尝试处理新数据包,直到没有新数据包到来,或者达到设置的一次中断最多处理的数据包个数。数据离开网卡驱动之后就进入到了协议栈,经过IP层、网络层协议的处理,就会触发IO读事件,比如epoll的reactor模型中,就会触发对应的读事件,然后回调对应的IO处理函数,数据之后会交给业务线程来处理,比如Netty的数据接收处理流程就是这样的。

二、套接字特性

套接字的特性有三个属性确定,它们是:域(domain),类型(type),和协议(protocol)。
:指定套接字通信中使用的网络介质。最常见的套接字域是 AF_INET(IPv4)或者AF_INET6(IPV6),它是指 Internet 网络。
类型:

  • 流套接字(SOCK_STREAM):
    流套接字用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复发送,并按顺序接收。流套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即TCP
  • 数据报套接字(SOCK_DGRAM):
    数据报套接字提供了一种无连接的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。数据报套接字使用UDP(User Datagram Protocol)协议进行数据的传输。
  • 原始套接字(SOCK_RAW):
    原始套接字与标准套接字(标准套接字指的是前面介绍的流套接字和数据报套接字)的区别在于:原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP协议的数据,数据报套接字只能读取UDP协议的数据。因此,如果要访问其他协议发送数据必须使用原始套接字。

协议:IPPROTO_TCP,IPPROTO_UDP

三、套接字缓冲区

每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区。write()/send() 并不立即向网络中传输数据,而是先将数据写入缓冲区中,再由TCP协议将数据从缓冲区发送到目标机器。一旦将数据写入到缓冲区,函数就可以成功返回,不管它们有没有到达目标机器,也不管它们何时被发送到网络,这些都是TCP协议负责的事情。read()/recv() 函数也是如此,也从输入缓冲区中读取数据,而不是直接从网络中读取。
在这里插入图片描述
用户程序缓冲区
用户进程通过系统调用访问系统资源的时候,需要切换到内核态,而这对应一些特殊的堆栈和内存环境,必须在系统调用前建立好。而在系统调用结束后,cpu会从核心模式切回到用户模式,而堆栈又必须恢复成用户进程的上下文。而这种切换就会有大量的耗时。
一些程序在读取文件时,会先申请一块内存数组,称为buffer,然后每次调用read,读取设定字节长度的数据,写入buffer(用较小的次数填满buffer)。之后的程序都是从buffer中获取数据,当buffer使用完后,在进行下一次调用,填充buffer。所以说:用户缓冲区的目的是为了减少系统调用次数,从而降低操作系统在用户态与核心态切换所耗费的时间。除了在进程中设计缓冲区,内核也有自己的缓冲区。
内核缓冲区
当一个用户进程要从磁盘读取数据时,内核一般不直接读磁盘,而是将内核缓冲区中的数据复制到进程缓冲区中。但若是内核缓冲区中没有数据,内核会把对数据块的请求,加入到请求队列,然后把进程挂起,为其它进程提供服务。等到数据已经读取到内核缓冲区时,把内核缓冲区中的数据读取到用户进程中,才会通知进程。
你可以认为,read是把数据从内核缓冲区复制到进程缓冲区。write是把进程缓冲区复制到内核缓冲区。当然,write并不一定导致内核的写动作,比如os可能会把内核缓冲区的数据积累到一定量后,再一次写入。这也就是为什么断电有时会导致数据丢失。所以说内核缓冲区,是为了在OS级别,提高磁盘IO效率,优化磁盘写操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263073.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[ZJOI2007] 时态同步

题面 显然的一个建模是,每个叶子对应一个权值,代表比最晚的叶子早了多久,然后我们要做的就是给每条边赋上值,使得每个叶子到根的路径上的所有边权值和等于叶子的权值。 我们贪心的想一想,必然是离根越近的边赋值多的情…

dsad

应该来说这是两两配对的时间 mouseenter和mouseleave是只对选中的元素的生效 mouseover和mouseout是只对选中的元素及其子元素生效 <iframe width"100%" height"300" src"//jsfiddle.net/xiadd/4hno1wgf/embedded/" allowfullscreen"all…

ARM-Button-Driver-硬件图

1、实物图 2、CPU接线图 3、实际硬件接图 转载于:https://www.cnblogs.com/xmphoenix/archive/2011/11/02/2233519.html

动态创建ActiveRecord条件的查询 MyQuery

在CMS中。我们经常会按一定的条件来进行搜索。如果用户没有选择这个条件的话&#xff0c;我们就不能将它放到sql中也许我们可以用自己拼装sql语句的方式很好的实现这种查询。然后再前面过滤掉一些危险的参数但是参数过滤有一个不好的地方是。会把一些信息给过滤掉了。在castle …

kubenetes中port、targetPort、nodePort、containerPort的区别与联系

kubenetes中port、targetPort、nodePort、containerPort的区别与联系首先给出一张kubenetes结构图&#xff1a;containerPort containerPort是在pod控制器中定义的、pod中的容器需要暴露的端口。Pod中容器暴露的端口 targetPort targetPort是pod上的端口&#xff0c;从port/nod…

Entity Framework中使用IEnumerableT、IQueryableT及IListT的区别

1. IEnumerable<T> IEnumerable<T> &#xff1a;对于在内存中集合上运行的方法&#xff0c;返回的可枚举对象将捕获传递到方法的参数。在枚举该对象时&#xff0c;将使用查询运算符的逻辑&#xff0c;并返回查询结果。 IEnumerable<T>在.Net2.0引入。 IEnumb…

█年薪20万招聘软件工程师!!!

工作地点&#xff1a;日本 工作类型&#xff1a;全职 职位类别&#xff1a;软件研发 招聘人数&#xff1a;60人 婚姻状况&#xff1a;不限 工作经验&#xff1a;1年 年龄要求&#xff1a;20-36岁 性别要求&#xff1a;不限 学…

UIView编程体验(一)

尽管这不是一个新的话题&#xff0c;但是实际上UIView是很多控件的基础类&#xff0c;而且界面的布局基本是基于UIView来的&#xff0c;当然我们也可以使用CGLayer,本文仅列举一些个人在使用UIView过程中的经验和大家分享。大部分的内容来源于UIView Programming Guide,这个gui…

解决Spring下无法实时访问本地静态资源

解决Spring下浏览器无法实时访问本地静态资源场景1&#xff1a;原本地文件test.json中内容为 “1”。我们通过前后端交互操作&#xff0c;修改test.json的内容为 “2”。此时前端再次读取test.json&#xff0c;会发现内容依旧为 “1”&#xff0c;即前端并不会实时同步本地静态…

java传值和通过引用传递

第一次使用int实验&#xff1a; public class TTEST {private static List<UserEntity> mList new LinkedList<UserEntity>(); public static void main(String[] args) {int a 0;changeA(a);System.out.println("a "a);}public static void change…

好消息:VS 2008 and .NET 3.5 Beta 2 发布了

消息来源:http://weblogs.asp.net/scottgu/archive/2007/07/26/vs-2008-and-net-3-5-beta-2-released.aspx下载地址http://www.microsoft.com/downloads/results.aspx?DisplayLangen&nr20&freetextvisualstudio2008&sortCriteriadate特点:- VS 2008 Multi-Targeti…

android 之数据存储(IO)

android 操作文件分为两种&#xff0c; 第一种&#xff1a;直接写到手机内存中&#xff0c;手机内存有限。 第二种&#xff1a;写到手机的内存卡(SD)中&#xff0c;进行操作文件。 以下分为两种情况的读精心操作&#xff0c;一个简单的demo.在此做一个记录。 代码。 package co…

Aspose.Java实现word转pdf,添加水印等操作

Aspose.Java实现word转pdf&#xff0c;添加水印等操作一. word转pdf二. 文档插入水印Aspose是一款商用版控件&#xff0c;支持各类文档操作&#xff0c;这里主要介绍如何在Springboot项目中使用破解版。 一. word转pdf 在项目中导入aspose.word包 百度网盘下载 提取码&#x…

django 1.8 官方文档翻译: 3-4-2 内建显示视图

Django 文档协作翻译小组人手紧缺&#xff0c;有兴趣的朋友可以加入我们&#xff0c;完全公益性质。 交流群&#xff1a;467338606 网站&#xff1a;http://python.usyiyi.cn/django/index.html 基于类的内建通用视图 编写Web应用可能是单调的&#xff0c;因为你需要不断的重复…

(原)学习ORACLE 视图

--视图--视图是一个逻辑表&#xff0c;是查看表的一种方式&#xff0c;用来定义来自一个或多个表的行和列的多种连接。通过视图&#xff0c;可以查看到表中的数据。--创建视图CREATE VIEW MYTEST.V_INFO(ID,NAME,LOGINNAME,Address)ASSELECT TEST.ID,TEST.NAME,TEST.LOGINNAME,…

记一次Hbase数据迁移和遇到的问题

因为集群不互通&#xff0c;所以采用手动方式迁移 1、下载目标集群数据 hadoop fs -get /apps/hbase/data/data/default/*c4be21d3000064c0 /mnt/data 2、远程复制数据&#xff0c;可以压缩一下 scp *** 3、上传数据到HDFS&#xff0c;一定要切换到hbase用户&#xff0c;不然会…

IIS中“使用 XSL 样式表无法查看 XML 输入”问题的解决

IIS中“使用 XSL 样式表无法查看 XML 输入”问题的解决2009-05-13 15:15今日安装IIS后&#xff0c;随便写了一个aspx的文件作为测试&#xff0c;发现浏览器中显示&#xff1a;使用 XSL 样式表无法查看 XML 输入。请更正错误然后单击 刷新按钮,或以后重试。这才发现了如下一个问…

SQL三种连接:内连接、外连接、交叉连接

SQL三种连接&#xff1a;内连接、外连接、交叉连接一、交叉连接&#xff08;CROSS JOIN&#xff09;二、内连接&#xff08;INNER JOIN&#xff09;三、外连接&#xff08;LEFT JOIN、RIGHT JOIN、FULL JOIN&#xff09;1.左外连接2.右外连接3.完整外连接准备两张表并以PersonI…

二叉树非递归先序遍历

二叉树的递归先序遍历很简单&#xff0c;假设二叉树的结点定义如下: 1 struct BinaryTreeNode 2 { 3 int m_nValue; 4 BinaryTreeNode* m_pLeft; 5 BinaryTreeNode* m_pRight; 6 }; 递归先序遵循:根-左-右的顺序 1 void PreOrder(BinaryTreeNode* Root) 2 { 3 …

面向对象与基于对象 区别

很多人没有区分“面向对象”和“基于对象”两个不同的概念。面向对象的三大特点&#xff08;封装&#xff0c;继承&#xff0c;多态&#xff09;却一不可。通常“基于对象”是使用对象&#xff0c;但是无法利用现有的对象模板产生新的对象类型&#xff0c;继而产生新的对象&…