网络协议

详解网络分层和网络协议工作原理
帅旋
关注
充电
IT宅站长,技术博主,共享单车手,全网id:arthinking。

Socket编程

发布于 2020-07-26 | 更新于 2024-01-29

1、Socket是什么

Socket是一个抽象层,主要是把TCP/IP层复杂的操作抽象为几个简单的接口提供给应用层调用,进而实现应用进程在网络中通信。Socket主要是端到端之间的传输协议(网络层之上的协议)。因为Socket是一种高层的抽象网络API,是一种端到端的通信,只能访问到端到端协议之上的网络层和传输层

image-20211023132200978

Socket起源于Unix,在Unix中,一切皆文件,Socket也不例外,是一种打开-读/写-关闭的模式实现的。在服务器和客户端各自维护了一个文件。

2、基于TCP的Socket通信交互流程

我们先来看一下基本TCP客户/服务器程序的套接字函数调用过程:

image-20211023145633273

TCP Socket的文件结构

在内核中,Socket是一个文件,不过Socket对应的inode不是保存在硬盘上,而是在内存中,该inode指向了Socket在内核的Socket结构。内核的Socket接口主要由两个队列:发送队列,接收队列。

内核为监听套接字维护的两个队列

对于每个监听Socket,内核都为其维护了两个队列:

  • 未完成队列(incomplete connection queue):这个队列的套接字服务端正在等待完成TCP三次握手,处于SYN_RCVD状态;
  • 已完成连接队列(completed connection queue):完成了三次握手的Socket连接会进入这个队列,处于ESTABLISHED状态。

如下图:

image-20211024135448891

3、基于UDP的Socket通信交互流程

UDP不需要三次握手,所以不需要listen和connect,但是交互仍然需要IP和端口号,需要bind。

UDP不用维护连接状态,所以不需要针对每个连接建立一组Socket,只需要一个就可以了。

以下是UDP的Socket通信交互流程图:

image-20211023145602278

到目前为止,我们把物理层、数据链路层、网络层、传输层主要的协议和功能都介绍了一遍。基于这些底层的协议栈支撑,我们可以很快的构建出应用层的程序,接下来我们简单讲一下应用层。

References

本文作者: 帅旋

本文链接: https://www.itzhai.com/columns/network/transport-layer/socket.html

版权声明: 版权归作者所有,未经许可不得转载,侵权必究!联系作者请加公众号。

×
IT宅

关注公众号及时获取网站内容更新。