文件描述符与套接字(socket)关系

套接字 socket 代表一个通信双方的 link:

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传输层能够知道数据传送的目的地。

一个TCP连接的套接字对(socket pair)是一个定义该连接的两个端点的四元组:本地IP地址、本地TCP端口、外地地址、外地TCP端口。套接字对唯一标识一个网络上的每个TCP连接。

标识每个端口的两个值(IP地址和端口号)通常称为一个套接字。

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

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

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

服务器建立连接的过程:

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

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

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

参考:

https://www.yuque.com/myboy-ipf95/kgi7au/kh8vee

https://www.yuque.com/myboy-ipf95/kgi7au/kh8vee

posted on 2020-10-27 14:37  TrustNature  阅读(1870)  评论(0)    收藏  举报