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)。它位于用户程序和内核的边界处,对应用程序屏蔽了网络通信的底层细节,如下图所示:
notion image

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, sshHTTP底层都是采用 Stream Sockets 传输数据。而那些对数据完整性要求没那么高的应用程序,比如游戏,音视频,底层一般采用 Datagram Sockets 传输数据 (速度快)。

归纳总结

这一章,我们主要介绍了一下套接字这个概念:它是利用文件描述符与其它进程通信的一种方式。从另一个角度看,它其实就是一些列的应用程序接口,对应用程序屏蔽了网络通信的底层细节。另外,我们还介绍了两种套接字类型:
  • Stream Sockets 可以提供有序的可靠的全双工的基于连接字节流传输方式。
  • Datagram Sockets 可以提供无连接不可靠,并且消息有最大的长度限制数据报传输方式。

参考文章

  • UNIX Network Programming, Volume 1: The Sockets Networking API, 3rd Edition
 
💬
欢迎您在底部评论区留言,我们一起交流学习~
 
高性能网络编程(2)——套接字地址高性能网络编程(0)——前言