性能专题>Linux内核源码分析>
10
3

Linux内核源码分析分享专题

Linux内核原理 | Socket底层的来龙去脉

当今互联网中的大千世界都驻足于TCP/IP协议之上。而通过Socket操作TCP/IP协议已经成为了事实上的标准,Socket甚至已经成为了网络编程的同义词。当然了,由于我们早已习惯于各种封装/框架,很少裸用Socket,所以对它的理解始终有一种模糊的感觉。
image1.png
今天,我就来介绍一下Socket。

Socket

socket在网络编程中被翻译为套接字。它的本意是插座,把它用来表示网络通信的接口确实很贴切。你看,两个需要通信的机器把他们的线缆插上插座(Socket),就可以通信了。

image2.png

Socket处于编程的什么位置

socket在程序员看来其实就是一个操作网络的API,应用程序通过Socket来和内核层面的tcp/ip等例程进行交互,最后由网卡发到整个网络上。

image3.png
当然了,Socket不仅仅是TCP的API,UDP、IP甚至其它一些协议也用Socket来操作。由于它是个普遍的标准,所以基本一切可供应用层使用的协议API都和Socket有关。

平常的Socket都用到哪

一般应用里面只要和别人通信,都需要socket。无论是http、dubbo还是jdbc,林林总总,有通信的地方都有socket。

image4.png

为什么Socket这么流行

为什么Socket这么流行,已经成为了网络编程的同义词呢?其实就是由于其提供了非常简洁的接口。除了打开方式稍稍有些复杂之外,其它和读文件一样,只需要read/write即可。
image5.png

Socket和连接之间的关系

一对相互通信的socket就组成了我们天天挂在嘴边的连接,一般(本端ip:port,协议,对端ip:port)组成一个唯一的连接。
image6.png

Client端socket以及Server端socket

就TCP来说,Socket分为Client端和Server端两种。就以一个简单的Java时间服务器为例

看下,代码的编写方法。

image7.png
这边client端采用的是短连接的方式连接server端,而server端用的是单线程处理socket的方式。采用的都是最简单的方案。其中有一个细节,如果需要让socket.read返回-1,那么对端的socket必须shutdown或者close才行。下图就是我们的处理流程:
image8.png

上面的代码笔者放在码云上面,有需要的同学可以去码云下载

git clone https://gitee.com/alchemystar/zero

总结

Socket由于其简洁的API被广泛使用,到现在已经成为了网络编程的同义词。正是由于其简洁性和易用性,在我们程序猿的手上演化出各种复杂的用法(阻塞/非阻塞,短连接/长连接,超时…),后面笔者会一一道来。

请先登录,感受更多精彩内容
快去登录吧,你将获得
  • 浏览更多精彩评论
  • 和开发者讨论交流,共同进步