type
status
date
slug
summary
tags
category
icon
password
网络编程其实就是利用套接字 (socket) 编写网络程序,那么什么是套接字呢?套接字其实就是:利用 Unix 文件描述符与其它程序通信的一种方式。
可是,网络通信咋就和文件描述符扯上关系了呢?
我们经常听说,在 Unix 的世界里,”一切皆文件”!这就话的言外之意就是:Unix 程序可以通过读写文件描述符来完成任何类型的 I/O 操作!文件描述符其实就是一个整数,它和一个打开文件相关联。读写文件描述符,其实就是读写和它相关联的打开文件。但是,那个打开文件可以是任意东西,只要它能够提供数据,或者接收数据。比如,它可以是磁盘上的文件、终端、管道、网络连接等等。请记住,在 Unix 中,一切皆文件!我们可以通过读写文件描述符来进行网络通信。
那我们怎么获取用于网络通信的文件描述符呢?答案很简单,调用
socket()
函数。该函数会返回一个文件描述符,然后我们就可以通过send()
和recv()
函数进行网络通信了。Q:如果是文件描述符,那可不可以用常规的
read()
和write()
进行网络通信呢?
A:可以的,但是send()
和recv()
函数可以对网络传输进行更强大的控制。从另一个角度来看,套接字其实是一系列应用程序接口 (Application programming interface, API)。它位于用户程序和内核的边界处,对应用程序屏蔽了网络通信的底层细节,如下图所示:

1 两种类型的套接字
接下来,我们要介绍两种不同类型的套接字 (
man 2 socket
)。一种是 “Stream Sockets”,另一种是 ”Datagram Sockets”, 在代码中它们又分别被称为为 ”SOCK_STREAM” 和 ”SOCK_DGRAM”。Stream Sockets 提供一种有序的,可靠的,全双工的,基于连接的字节流传输方式 (TCP)。比如说,我们按顺序发送“1,2”, 那么另一端也会按顺序收到”1,2”,并且数据不会出错。
Datagram Sockets 提供数据报(无连接,不可靠,并且消息有最大的长度限制)传输方式 (UDP)。使用 Datagram Sockets 发送数据报,另一端可能会收到数据,也可能不会收到数据,还有可能不是按发送的顺序收到数据。但有一点你不用担心,就是如果数据报到达了,那数据就不会出错。
Q: 那我们编写网络程序的时候,是该选择 Stream Sockets,还是选择 Datagram Sockets 呢?
A: 看情况。一般来说,需要保证数据完整性的应用(比如传输文件),都会使用 Stream Sockets。比如
telnet
, ssh
和HTTP
底层都是采用 Stream Sockets 传输数据。而那些对数据完整性要求没那么高的应用程序,比如游戏,音视频,底层一般采用 Datagram Sockets 传输数据 (速度快)。归纳总结
这一章,我们主要介绍了一下套接字这个概念:它是利用文件描述符与其它进程通信的一种方式。从另一个角度看,它其实就是一些列的应用程序接口,对应用程序屏蔽了网络通信的底层细节。另外,我们还介绍了两种套接字类型:
- Stream Sockets 可以提供有序的,可靠的,全双工的,基于连接的字节流传输方式。
- Datagram Sockets 可以提供无连接,不可靠,并且消息有最大的长度限制的数据报传输方式。
参考文章
- UNIX Network Programming, Volume 1: The Sockets Networking API, 3rd Edition
欢迎您在底部评论区留言,我们一起交流学习~
- 作者:Thomas He
- 链接:https://notion-next-lovat-ten.vercel.app/article/networkprogramming/1
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章