首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

超详细的Socket通信原理和实例讲解

我们大家知道,协议栈其实是位于操作系统的一些协议的堆叠,这些协议包括 TCP、UDP、ARP、ICMP、IP等。2022年嵌入式开发想进互联网大厂,你技术过硬吗?...操作系统内部有一块用于存放控制信息的存储空间,这块存储空间记录了用于控制通信的控制信息。其实这些控制信息就是 Socket 的实体,或者说存放控制信息的内存空间就是套接的实体。...我们 Windows 的命令提示符输入 netstat -ano # netstat 用于显示套接内容 , -ano 是可选选项 # a 不仅显示正在通信的套接,还显示包括尚未开始通信等状态的所有套接...应用程序中有一个 socket 组件,应用程序启动时,会调用 socket 申请创建套接,协议栈会根据应用程序的申请创建套接:首先分配一个套接所需的内存空间,这一步相当于是为控制信息准备一个容器...在这种情况下,发送缓冲区数据就会超过 MSS 的长度,发送缓冲区数据会以 MSS 大小为一个数据包进行拆分,拆分出来的每块数据都会加上 TCPIP,以太网头部,然后被放进单独的网络包

1.4K20

从Memcached的socket了解TCP参数

Memcached一共用到了3种套接(即: TCP, UDP和NUIX域套 接) UNIX Domain Socket 与 TCP/IP Socket 对比 socket API原本是为网络通讯设计的...,也可以全关闭,取决为howto SHUT_RD 关闭连接的读这一半--套接不再有数据可以接收,而且该套接现有的数据都被丢弃.进程不能对该套接字调用任何读函数....SHUT_WR 关闭连接的写一半--对于TCP套接,这称为半关闭.当前留在套接发送缓冲区数据将被发送掉,后跟TCP正常终止序列.不管套接引用计数是否为0,写半部照样关闭.进程不能对套接字调用任何写函数...; 设置l_onoff为非0,l_linger为0,则套接口关闭时,TCP将丢弃保留在套接发送缓冲区的任何数据发送一个RST给对方,而不是通常的四分组终止序列,这避免了TIME_WAIT状态; 设置...如果套接口缓冲区残留数据,进程将处于睡眠状态,直 到所有数据发送完且被对方确认,之后进行正常的终止序列(描述访问计数为0)或者延迟时间到。

45720
您找到你想要的搜索结果了吗?
是的
没有找到

网络编程,来了!

面向连接的效果图: TCP通信步骤: 创建链接 传输数据 关闭链接 说明: TCP通信模型相当于生活的“打电话”,通信开始之前,一定要先建立好连接,才能发送数据,通信结束要关闭。...2、TCP客户端程序开发流程的介绍 步骤说明: 创建客户端套接对象 和服务端套接建立连接 发送数据 接受数据 关闭客户端套接 3、TCP服务端程序开发流程的介绍 步骤说明: 创建服务端套接对象...和recv原理剖析 1、认识TCP socket的发送和接受缓冲区 当创建一个TCP socket对象的时候会有一个发送缓冲区和一个接收缓冲区,这个发送和接收缓冲区指的就是内存的一片空间。...不是,要想发数据,必须得通过网卡发送数据,应用程序是无法直接通过网卡发送数据的,它需要调用操作系统接口,也就是说,应用程序把发送数据写入到发送缓冲区(内存的一片空间),再由操作系统控制网卡把发送缓冲区的数据发送给服务端网卡...不是,应用软件是无法直接通过网卡接收数据的,它需要调用操作系统接口,由操作系统通过网卡接收数据,把接收的数据写入到接收缓冲区(内存的一片空间),应用程序再从接收缓冲区获取客户端发送数据

34630

计算机网络:协议栈套接如何连接?

:图片应用程序代表客户端,浏览器,电子邮件等程序,这些程序发出请求委派给下一层的SocketSocket程序解析器也是Socket的一部分用于DNS服务查询域名的IP地址,其他部分就是委派操作系统的协议栈去处理数据操作系统操作系统的协议栈分为两部分...,上半部分为TCP/UDP协议;下半部分为IP协议;IP协议部分用于接受TCP,UDP的请求进行填充额外控制信息,数据在网络如果超过一定长度(后面讲解)是需要切割分成一个一个包进行传输的,而IP协议就是用于收发网络包的...因为操作系统是委托网卡的,网卡需要知道MCA地址)驱动程序网卡驱动程序用于控制网卡,IP协议向网卡驱动程序发送的数字信号接下来会被网卡转换数为电信号在网线传输。...套接协议栈的内部会有一块记录通信对方的ip端口,通信状态,使用这块内存的应用pid的内存空间等,这个内存空间就是套接存储的内容,这些内容叫做控制信息协议栈需要根据套接所存储的控制信息进行下一步的操作...协议栈的tcp模块根据ip地址和端口号接着创建tcp头部信息讲这些信息填入,协议栈的tcp模块也就知道了服务器的ip和端口 接着委托ip模块 和服务器的ip模块发送数据服务端填补信息和客户端不一样,创建套接是服务器启动就会执行的

17920

如何避免TCP的TIME_WAIT状态(高并发)

SO_LINGER socket 异常终止连接发送RST 不进入四次挥手手 解释最清楚的当属《Unix网络编程卷1》的说明(7.5章节),这里简单摘录: SO_LINGER的值用如下数据结构表示...time */}; 其取值和处理如下: 1、设置 l_onoff为0,则该选项关闭,l_linger的值被忽略,等于内核缺省情况,close调用会立即返回给 调用者,如果可能将会传输任何未发送数据...; 2、设置 l_onoff为非0,l_linger为0,则套接口关闭时TCP夭折连接,TCP将丢弃保留在套接发送缓冲 区的任何数据发送一个RST给对方, 而不是通常的四分组终止序列,这避免了...如果套接口缓冲区残留数据,进程将处于睡眠状态,直 到(a)所有数据发送完且被对方确认,之后进行正常的终止序列(描述访问计数为0) ?...方法3:修改系统配置 (不建议) sysctl改两个内核参数就行了,如下: net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_tw_recycle = 1 简单来说,就是打开系统的

2.7K50

进程间通信的历史与未来

父进程一方将描述符 w 关闭。 子进程一方将描述符 r 关闭。 子进程一方将要发送给父进程的数据写入描述符 w。 父进程一方从描述符 r 读取数据。 笔者直接上代码演示: #!...这个词原本是荷兰语「旗语」的意思,信号量可以设定对某种「资源」同时访问数量的上限。   共享内存是一块进程间共享的内存空间。...Datagram Protocol,用户数据协议)套接都是建立 IP(Internet Protocol,网际协议)协议之上的上层网络通信套接。...这两种套接都可用于以网络为媒介的结算机通信。但它们性质上有一些区别。   TCP 套接是一种基于连接的、具备可靠性的数据流通信套接。...TCP 套接和 UDP 套接都是通过 IP 地址和端口号来进行工作的。

1.2K140

讨论 Setsockopt选项

发出第一个探测分节11分钟15秒后若无响应就放弃。套接口的待处理错 误被置为ETIMEOUT,套接口本身则被关闭。...现在服务器创建了一个套接同时等待连接。TCP/IP式的连接过程就是所谓“3次握手”。首先,客户程序发送一个设置SYN标志而且不带数据负载的TCP包(一个SYN包)。...为了减轻这些问题所带来的影响,Linux(以及其他的一些操作系统)在其TCP实现包括了TCP_DEFER_ACCEPT选项。...它们设置侦听套接的服务器方,该选项命令内核不等待最后的ACK包而且第1个真正有数据的包到达才初始化侦听进程。发送SYN/ACK包之后,服务器就会等待客户程序发送数据IP包。...连接套接上设置该选项以后,客户收到一个SYN/ACK包之后就不再发送ACK包,而是等待用户程序的下一个发送数据请求;因此,服务器发送的包也就相应减少了。

1.2K20

收发数据的原理(上)

协议栈内部有一块存放控制信息的内存空间,用于记录通信操作的控制信息。比如通信对象的IP地址、端口号、通信操作的状态等。所以硬要说套接是个实体,那就是这些控制信息或者是保存这些控制信息的内存空间。...应用程序调用socket程序申请创建套接,而协议栈则根据应用程序的申请执行创建套接的操作。 创建过程,协议栈会分配一个用于存放套接所需的内存空间,用于存放记录套接操作的控制信息。...连接实际上通信双方交换控制信息,套接记录必要信息并准备数据收发的一连串操作。 控制信息,是控制数据收发操作的一些信息。IP地址、端口号就属于其中的信息。其余的控制信息,我们后面再介绍。...连接操作的第一步是TCP模块处创建表示连接控制信息的头部 通过TCP头部发送方和接收方的端口号可以找到要连接的套接TCP头部创建好之后,接下来TCP模块会将信息传给IP模块并委托它进行发送...IP模块执行网络包发送操作后,网络包就会通过网络发送到服务器的IP模块,再由服务器的IP模块把接收到的数据传给服务器自身的TCP模块,这时,服务器的TCP模块会根据TCP头部的信息找到端口号对应的套接

75720

网络套件(理论知识)

通常数据的传输是跨局域网的,数据传输过程中会经过若干个路由器, 而在上篇博客中提到路由器是看作TCP/IP五层(或四层)模型的网络层。...五、socket 套接编程,常常将IP地址和端口号结合起来表示一个通信的端点,这种组合称为套接地址。因此,可以说IP地址和端口号一起构成了一个套接地址。...然而,严格来说,套接操作系统的一个抽象概念,用于表示网络通信的端点,而IP地址和端口号只是套接地址的组成部分,用于确定通信的目的地或来源。...因此,套接通常是由IP地址、端口号和协议类型(如TCP或UDP)一起确定的. 5.1socket编程接口 C语言中,使用套接(socket)进行网络编程时,常见的编程接口包括:  socket()...发送主机通常将发送缓冲区数据内存地址从低到高的顺序发出; 接收主机把从网络上接到的字节依次保存在接收缓冲区,也是按内存地址从低到高的顺序保存; 因此,网络数据流的地址应这样规定:先发出的数据是低地址

8910

服务器开发中网络数据分析与故障排查经验漫谈

阻塞套接字模式下,send函数如果由于对端tcp窗口太小,不足以将全部数据发送出去,将阻塞执行流,直到出错或超时或者全部发送出去为止;同理recv函数如果当前协议栈系统缓冲区数据可读,也会阻塞执行流...SHUT_WR/SHUT_RDWR,SHUT_RD表示关闭收消息链路,即该套接不能再收取数据,同理SHUT_WR表示关闭套接发消息链路,但是这里有个问题,有时候我们需要等待缓冲区数据发送完后再关闭连接怎么办...通过上面的分析,我们得出结论,shutdown函数并不会要求操作系统底层回收套接等资源,真正会回收资源是close函数,这个函数会要求操作系统回收相关套接资源,并释放对ip地址与端口号二元组的占用,...5 常见的套接选项 严格意义上说套接选项是有不同层级的(level),如socket级别、TCP级别、IP级别,这里我们不区分具体的级别。...这个选项的用处是用于解决,当需要关闭套接时,协议栈发送缓冲区尚有未发送出去的数据,等待这些数据发完的最长等待时间。

1.4K50

高性能网络编程2----TCP消息的发送

http://blog.csdn.net/russell_tao/article/details/9370109 在上一篇,我们已经建立好的TCP连接,对应着操作系统分配的1个套接。...操作TCP协议发送数据时,面对的是数据流。通常调用诸如send或者write方法来发送数据到另一台主机,那么,调用这样的方法时,操作系统内核中发生了什么事情呢?...当应用层调用TCP层提供的发送方法时,内核的TCP模块tcp_sendmsg方法里,会按照对方告知的MSS来分片,把消息流分为多个网络分组(如图1的3个网络分组),再调用IP层的方法发送数据。...即,send方法返回成功了,也不一定把IP报文都发送到网络中了。因此,需要把用户需要发送的用户态内存数据,拷贝到内核态内存,不依赖于用户态内存,也使得进程可以快速释放发送数据占用的用户态内存。...(6)图1的例子,我们假定使用了阻塞套接,且等待了足够久的时间,收到了对方的ACK,滑动窗口释放出了缓存。 (7)将剩下的用户态数据都组成MSS报文拷贝到内核态的sk_buff

81620

高性能网络编程2—-TCP消息的发送

在上一篇,我们已经建立好的TCP连接,对应着操作系统分配的1个套接。操作TCP协议发送数据时,面对的是数据流。...通常调用诸如send或者write方法来发送数据到另一台主机,那么,调用这样的方法时,操作系统内核中发生了什么事情呢?...当应用层调用TCP层提供的发送方法时,内核的TCP模块tcp_sendmsg方法里,会按照对方告知的MSS来分片,把消息流分为多个网络分组(如图1的3个网络分组),再调用IP层的方法发送数据。...即,send方法返回成功了,也不一定把IP报文都发送到网络中了。因此,需要把用户需要发送的用户态内存数据,拷贝到内核态内存,不依赖于用户态内存,也使得进程可以快速释放发送数据占用的用户态内存。...(6)图1的例子,我们假定使用了阻塞套接,且等待了足够久的时间,收到了对方的ACK,滑动窗口释放出了缓存。 (7)将剩下的用户态数据都组成MSS报文拷贝到内核态的sk_buff

76931

socket原理讲解_电感器的作用及原理

TCP/IP协议存在于OS,网络服务通过OS提供,OS增加支持TCP/IP的系统调用——Berkeley套接,如Socket,Connect,Send,Recv等 UDP(User Data...设计模式,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。...许多操作系统套接描述符和其他I/O描述符是集成在一起的,所以应用程序可以对文件进行套接I/O或I/O读/写操作。...操作系统把该描述符作为索引访问进程描述符表,通过指针找到保存该文件所有的信息的数据结构。 针对套接的系统数据结构: 1)、套接API里有个函数socket,它就是用来创建一个套接。...字节序,顾名思义字节的顺序,就是大于一个字节类型的数据内存的存放顺序,一个字节的数据没有顺序的问题了。

30710

服务器开发中网络数据分析与故障排查经验谈

阻塞套接字模式下,send函数如果由于对端tcp窗口太小,不足以将全部数据发送出去,将阻塞执行流,直到出错或超时或者全部发送出去为止;同理recv函数如果当前协议栈系统缓冲区数据可读,也会阻塞执行流...SHUT_WR/SHUT_RDWR,SHUT_RD表示关闭收消息链路,即该套接不能再收取数据,同理SHUT_WR表示关闭套接发消息链路,但是这里有个问题,有时候我们需要等待缓冲区数据发送完后再关闭连接怎么办...通过上面的分析,我们得出结论,shutdown函数并不会要求操作系统底层回收套接等资源,真正会回收资源是close函数,这个函数会要求操作系统回收相关套接资源,并释放对ip地址与端口号二元组的占用,...5 常见的套接选项 严格意义上说套接选项是有不同层级的(level),如socket级别、TCP级别、IP级别,这里我们不区分具体的级别。...这个选项的用处是用于解决,当需要关闭套接时,协议栈发送缓冲区尚有未发送出去的数据,等待这些数据发完的最长等待时间。

1.1K30

网络是怎样连接的 第一、二章 笔记

描述符,应用程序会将其存放在内存 同一台计算机上可能同时存在多个套接,我们需要一种方法来识别出某个特定的套接,也就是描述符的作用 当创建套接字后,我们就可以使用这个套接来执行收发数据的操作...传入了 描述符、IP地址、端口号 其中IP地址、端口号被传递给协议栈TCP模块 TCP头部 客户端先创建一个包含很多开始数据收发操作的控制信息的头部 通过头部发送方和接收方端口可以找到需要连接的套接...模块根据TCP头部的信息找到端口号对应的套接 找到套接字后,套接中会写入相应的信息,并将状态改为正在连接 上述操作完成后,服务器TCP模块会返回响应,这个过程和客户端一样,需要在TCP头部设置发送方和接收方以及...,但TCP协议规格没有规定如何平衡 因此不同种类和版本的操作系统相关操作上也就存在差异 数据拆分 发送缓冲区数据超过MSS的长度时,数据就会被以MSS长度为单位进行拆分,拆分出来的每块数据会被放进单独的网络包...分片重组 接下来包会被交给TCP模块,TCP模块会根据IP头部的接收方和发送IP地址,一级TCP头部的接收方和发送方端口来查找对应的套接 找到对应的套接之后,就可以根据套接记录的通信状态

74810

网络之socket套接-基础知识

我们在网络通信过程IP + port唯一标识一个进程,IP有源IP和目的IP,port也有源port和目的port。 我们发送数据时也要将自己的IP和端口号发送过去,因为数据还要被发送回来。...三、网络字节流 1.大端和小端数据 我们知道内存的多字节数据相对于内存地址有大端和小端之分。...(接收数据同理) 如何定义网络数据流的地址 发送主机,把发送缓冲区内的数据内存地址由低到高的顺序发送(即,先发出的数据低地址,后发出的数据高地址。)...域间套接只能在本地通信; 3.原始套接可以跨传输层(TCP/IP协议)访问底层的数据。...套接是一种网络通信机制,IP + 端口号是套接的构成形式。 网络字节序规定为大端(我们规定网络数据是大端形式)。 sockaddr使用统一的接口解决所有网络或者其他场景下的通信问题。

27330

协议栈——创建套接

地址,其他部分就是委派操作系统的协议栈去处理数据操作系统 操作系统的协议栈分为两部分,上半部分为TCP/UDP协议;下半部分为IP协议;IP协议部分用于接受TCP,UDP的请求进行填充额外控制信息,...数据在网络如果超过一定长度(后面讲解)是需要切割分成一个一个包进行传输的,而IP协议就是用于收发网络包的。...因为操作系统是委托网卡的,网卡需要知道MCA地址) 驱动程序 网卡驱动程序用于控制网卡,IP协议向网卡驱动程序发送的数字信号接下来会被网卡转换数为电信号在网线传输。...套接 协议栈的内部会有一块记录通信对方的ip端口,通信状态,使用这块内存的应用pid的内存空间等,这个内存空间就是套接存储的内容,这些内容叫做控制信息 协议栈需要根据套接所存储的控制信息进行下一步的操作...netstat命令用于查看套接内容 proto协议类型tcp或者udp协议 localaddress “:”前面代表本机使用的ip地址(ip地址本来是网卡才有的,因为计算机内部有很多网卡,所以也就说计算机有很多

63710

Linux的SOCKET编程详解

TCP/IP协议存在于OS,网络服务通过OS提供,OS增加支持TCP/IP的系统调用——Berkeley套接,如Socket,Connect,Send,Recv等 UDP(User Data...它是属于TCP/IP协议族的一种。如图: TCP/IP协议族包括运输层、网络层、链路层,而socket所在位置如图,Socket是应用层与TCP/IP协议族通信的中间软件抽象层。...设计模式,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。...许多操作系统套接描述符和其他I/O描述符是集成在一起的,所以应用程序可以对文件进行套接I/O或I/O读/写操作。...字节序,顾名思义字节的顺序,就是大于一个字节类型的数据内存的存放顺序,一个字节的数据没有顺序的问题了。

2.5K10

Linux的SOCKET编程详解

TCP/IP协议存在于OS,网络服务通过OS提供,OS增加支持TCP/IP的系统调用——Berkeley套接,如Socket,Connect,Send,Recv等 UDP(User Data...设计模式,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。...许多操作系统套接描述符和其他I/O描述符是集成在一起的,所以应用程序可以对文件进行套接I/O或I/O读/写操作。...操作系统把该描述符作为索引访问进程描述符表,通过指针找到保存该文件所有的信息的数据结构。 针对套接的系统数据结构: 1)、套接API里有个函数socket,它就是用来创建一个套接。...字节序,顾名思义字节的顺序,就是大于一个字节类型的数据内存的存放顺序,一个字节的数据没有顺序的问题了。

8.2K10

Linux文件类型

管道都是一端写入、另一端读取,它们是单方向数据传输的,它们的数据都是直接在内存传输的,管道是进程间通信的一种方式,例如父进程写,子进程读。...虽然命名管道文件保留在文件系统,但是这个文件只是使用命名管道的一个入口,使用命名管道传输数据的时候,仍然是在内存中进行的,也就是说并不会因为保留在文件系统上命名管道的效率就低了。...当然,从协议族往下,套接可细分为很多种类型,例如INET套接可以分为TCP套接、UDP套接、链路层套接、Raw套接等等。其中网络套接是网络编程的基础和核心。...实际上,某些语言某些操作系统平台上实现的管道功能就是通过Unix Domain来实现的,可想而知其高效率。...进程1向自己的套接的send buffer写入数据,将发送到对端的recv buffer,然后对端的进程2就可以从recv buffer读取数据,反之亦然。

3K10
领券