socket基本概念
1.socket 是什么?
在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发 送数据。
2.Linux 中的 socket 是什么?
在 UNIX/Linux 系统中,为了统一对各种硬件的操作,简化接口,不同的硬件设备也都被看成一个文件。对这些文件的操作,等同于对磁盘上普通文件的操作。
UNIX/Linux 中的一切都是文件!
为了表示和区分已经打开的文件,UNIX/Linux 会给每个文件分配一个 ID,这个 ID 就是一个整数,被称为文件描述符(File Descriptor)。例如:
- 通常用 0 来表示标准输入文件(stdin),它对应的硬件设备就是键盘;
- 通常用 1 来表示标准输出文件(stdout),它对应的硬件设备就是显示器。
UNIX/Linux 程序在执行任何形式的 I/O 操作时,都是在读取或者写入一个文件描述符。一个文件描述符只是一个和打开的文件相关联的整数,它的背后可能是一个硬盘上的普通文件、FIFO、管道、终端、键盘、显示器,甚至是一个网络连接。
请注意,网络连接也是一个文件,它也有文件描述符!你必须理解这句话。
我们可以通过 socket() 函数来创建一个网络连接,或者说打开一个网络文件,socket() 的返回值就是文件描述符。有了文件描述符,我们就可以使用普通的文件操作函数来传输数据了,例如:
- 用 read() 读取从远程计算机传来的数据;
- 用 write() 向远程计算机写入数据。
你看,只要用 socket() 创建了连接,剩下的就是文件操作了,网络编程原来就是如此简单!
3.套接字的类型
<1>流格式套接字(基于TCP)
SOCK_STREAM 是一种面向连接的、可靠的、双向的通信数据流,数据可以准确无误地到达另一台计算机,如果损坏或丢失,可以重新发送。
SOCK_STREAM 有以下几个特征:
-
- 数据在传输过程中不会消失;
- 数据是按照顺序传输的;
- 数据的发送和接收不是同步的(有的教程也称“不存在数据边界”)--有缓存区
<2>数据报格式套接字(基于UDP)
SOCK_DGRAM 是无连接的不可靠的,不会进行数据的检查
它有以下特征:
-
- 强调快速传输而非传输顺序;
- 传输的数据可能丢失也可能损毁;
- 限制每次传输的数据大小;
- 数据的发送和接收是同步的(有的教程也称“存在数据边界”)。
《1》无连接的套接字
-
- 数据包的路径随意
- 受到:路径长短开销、路径拥堵、路由排队时延(可能丢包)的影响
- 尽力而为
- 传输效率高,但是不可靠,有丢失数据包、捣乱数据的风险
《2》面向连接的套接字
-
- 在发送方和接收方之间建立链路(虚电路)
- 数据按顺序的可靠传输
- 非常可靠,万无一失,传输效率低,耗费资源多
5.OSI七层网络模型和TCP/IP的四层模型
应用层 | 应用层 |
表示层 | |
会话层 | |
传输层 | 传输层 |
网络层 | 网络层 |
数据链路层 | 网络接口 |
物理层 |
两台计算机进行通信时,必须遵守以下原则:
- 必须是同一层次进行通信,比如,A 计算机的应用层和 B 计算机的传输层就不能通信,因为它们不在一个层次,数据的拆包会遇到问题。
- 每一层的功能都必须相同,也就是拥有完全相同的网络模型。如果网络模型都不同,那不就乱套了,谁都不认识谁。
- 数据只能逐层传输,不能跃层。
- 每一层可以使用下层提供的服务,并向上层提供服务。
我们所说的 socket 编程,是站在传输层的基础上,所以可以使用 TCP/UDP 协议,但是不能干「访问网页」这样的事情,因为访问网页所需要的 http 协议位于应用层。
6.TCP/IP 协议簇
TCP/IP 模型包含了 TCP、IP、UDP、Telnet、FTP、SMTP 等上百个互为关联的协议,其中 TCP 和 IP 是最常用的两种底层协议,所以把它们统称为“TCP/IP 协议族”。
也就是说,“TCP/IP模型”中所涉及到的协议称为“TCP/IP协议族”,你可以区分这两个概念,也可以认为它们是等价的
socket 编程是基于 TCP 和 UDP 协议的,它们的层级关系如下图所示:
7.IP、MAC和端口号——网络通信中确认身份信息的三要素
<1>IP地址:一般一个局域网用一个IP地址(公网地址:买的),因为IPV4地址如果一台计算机一个肯定不够用
<2>MAC地址:固定的写在网卡上
<3>端口号:应用层程序的接口
本文参考:C语言中文网 http://c.biancheng.net/view/2128.html