Socket

155 阅读6分钟

前言

本文首先通过打电话的例子,介绍了Socket的含义,然后讲述了它建立连接的过程,由此引出TCP/IP和Socket的关系,最后介绍了Socket的读写缓存区和文件描述符。

1、介绍

在理解什么是socket之前,我们举一个生活中常见的例子,打电话。我想要给女朋友打电话,首先我要拨通女朋友的电话号码,经过无线电传输,对方手机收到到我打的电话信号并发出电话铃声,最后女朋友点击接听键,一次电话连线就完成了。连线成功后,你可以对女朋友说话,女朋友也可以对你说话。这个过程就和socket连接非常像

如果有计算机A想要和计算机B通过网络进行通信,那么计算机A中必须要有一个socket,计算机B也要有一个socket,这两个socket一旦进行连接,计算机A就能向计算机B发送接收数据,计算机B也能向计算机A发送接收数据了。计算机A向计算机B发送数据,就会用到SocketA的OutputStream,计算机A接收计算机B的数据,就会用到Socket的InputStream。

1.1、官方解释

oracle官方文档中有对socket的详细解释,相信看了我上面的解说,就能更好的理解了

A socket is one endpoint of a two-way communication link between two programs running on the network. A socket is bound to a port number so that the TCP layer can identify the application that data is destined to be sent to.

中文翻译是,网络中运行的两个程序,他们建立起了一个能够使双方互相通信的链接,一个socket就是这个链接的一个末端。一个socket绑定一个端口,这样使得TCP传输层能够知道数据传送的目的地。

2、建立连接的过程

首先服务器(server)上有一个socket绑定了80端口(80端口是为HTTP超文本传输协议开放的端口),服务器会一直等待,直到有客户端(client)向服务端发送了连接请求

client会把自己的ip和端口信息告诉server,这样server就会在本地开启一个与client同端口号的端口,并创建一个新的socket,保证80端口的socket能够继续监听其他的连接

这样一对socket就建立完成了,客户端与服务端就能通过socket进行数据的发送和读取了。

3、TCP/IP和Socket的关系

TCP/IP, or the Transmission Control Protocol/Internet Protocol, is a suite of communication protocols used to interconnect network devices on the internet.

TCP/IP也叫做传输控制协议/网络协议,它是一套用来连接互联网上网络设备的协议。那么什么是协议呢?通俗的来说,协议就好比是交通规则,它规划公路上的汽车司机怎么走,它是一套规范。TCP/IP协议就是一套互联网间数据传输的规范。

说了这么多,那socket在哪里呢? 从图中可以看出,Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口(API)。我们所说的TCP/IP网站栈是在操作系统内核实现的,而Socket就是操作系统内核提供给应用层的一系列接口,Socket封装了TCP/IP,要使用TCP/IP来发送数据,就调用Socket的OutputStream,要使用TCP/IP接收数据,就调用Socket的InputStream,现在大家应该对TCP/IP与Socket的关系有所了解了吧。

4、Socket的读写缓存区

现在计算机A与计算机B建立了Socket连接,这时候计算机A要发送数据给计算机B,是不是直接就发送过去了呢,答案是NO,Socket发送数据首先需要经过Socket的读写缓冲区,我们现在来了解一下Socket的读写缓冲区

首先我们必须要搞清楚数据发送的流程,用户态的数据,要想发送到互联网上,必须先把数据拷贝到内核态,由内核态帮我们把数据发送出去。 因此,计算机每创建一个socket,cpu就会在内存中为它分配一对读写缓冲区,读写缓冲区在内核态,它的大小不随数据大小而改变。

计算机A想发数据到计算机B,首先计算机A把用户态的数据拷贝到内核态的输出缓冲区,再由把输出缓冲区的数据通过互联网发送到计算机B的输入缓冲区,计算机B把输入缓冲区的数据拷贝到用户态,就完成了一次数据的发送和接收。

由于数据缓冲区的大小有限,如果数据缓冲区里有数据没有发送出去,用户态这时候又有其他数据要发送,数据缓冲区的空间就不够用了,就会造成一系列问题。如果计算机B要接收数据,而一直没有收到计算机A发送过来的数据,导致输入缓冲区一直为空,也会造成问题。

对于上面这些存在的问题,linux有5中解决方案,这就是linux的5大IO模型。

在了解IO模型之前,我们还需要知道什么是文件描述符。

5、文件描述符(fd)

文件描述符(file descriptor)是操作系统内核为了高效管理已被打开的文件所创建的索引,用于替代被打开的文件

在linux操作系统中,每一个进程中都有一个文件描述符表,它是一个指针数组,系统默认初始化了数组的前3位。第0位指向标准的输入流(一般是键盘),第1位指向标准的输出流(一般是显示器),第2位指向标准的错误流(一般是也显示器)。

现在如果有一个进程中只打开了一个 hello.txt 文件,那么这个进程的文件描述符表的第3位就是指向这个 hello.txt 的指针。之后如果该进程创建了一个socket,那么这个文件描述符表的第4位就是指向这个socket的指针,因为在linux中一切皆文件,socket也是一个文件。我们所说的文件描述符就是进程中这个数组的下标,因此他也可以说是一个索引