2023.7.6
第2章 套接字类型与协议设置
2.1 套接字协议及其数据传输特性
协议:计算机间对话必备的通信规则,即为了完成数据交换而定好的约定。
socket函数的三个参数:int socket(int domain, int type, int protocol)
- domain:套接字中使用的协议族信息。 常见协议族有PE_INET ipv4互联网协议族
- type:套接字数据传输类型信息
- protocol:计算机间通信中使用的协议信息
套接字类型1:面向连接的套接字(SOCK_STREAM) 其有下列特征:
- 传输过程数据不丢失
- 按序传输数据
- 传输的数据不存在数据边界
下面解释一下不存在数据边界的含义:
当说传输的数据不存在数据边界时,指的是在使用TCP协议进行数据传输时,数据被划分为一系列称为"数据段"的小块进行传输。与其他一些协议(如UDP)不同,TCP协议并不关心数据的边界或大小。
具体而言,TCP协议将数据流划分为一系列的数据段,并在每个数据段的首部添加一些用于管理和控制传输的信息,如序列号、确认号和控制标志等。这些数据段被发送到网络上,并在接收端重新组装成完整的数据流。
因此,TCP协议并不关心数据在发送时的边界或大小。无论数据有多大,TCP协议会根据网络状况和接收端的可用性来决定如何划分和发送数据段。接收端则负责接收和重新组装这些数据段,以还原原始的数据流。
通过套接字传输的数据将保存到一个缓冲数组中,因此收到数据并不意味着马上调用read函数,只要不超过数组容量,则有可能在数据填充满缓冲后通过1次read函数调用读取全部,也有可能分成多次read函数调用进行读取。
一句话概括面向连接的套接字:可靠的、按序传递的、基于字节的、面向连接的数据传输方式的套接字。
套接字类型2:面向消息的套接字(SOCK_DGRAM) 其有下列特征:
- 强调快速传输而非传输顺序。
- 传输的数据可能丢失和损毁
- 传输的数据有数据边界
- 限制每次传输的数据大小
存在数据边界意味着接收数据的次数应和传输次数相同。
一句话概括面向消息的套接字:不可靠的、不按序传递的、以数据的高速传输为目的的套接字。
创建TCP套接字:int tcp_ socket = socket(PF_ INET, SOCK_ STREAM, IPPROTO TCP);
创建UDP套接字:int udp_ socket = socket(PF_ INET, SOCK_ DGRAM,IPPROTO UDP);
实验:
![](https://i-blog.csdnimg.cn/blog_migrate/01883a737b3e411371cd6de591a86071.png)
服务器端发送了13字节的数据,客户端调用13次read函数进行读取。
2.2、windows平台下的实现及认证
Windows的函数名和参数名都与Linux平台相同,只是返回值类型稍有不同。下面给出socket函数的声明:
#include <winsock2. h>
SOCKET socket(int af, int type, int protocol);
成功时返回socket句柄,失败时返回INVALID SOCKET。
看出返回值类型为SOCKET,此结构体用来保存整数型套接字句柄值。实际上,socket函数返回整数型数据,因此可以通过int型变量接收,就像在Linux中做的一样。但考虑到以后的扩展性,定义为socket数据类型。
实验略。
2.3、习题
1、什么是协议?在收发数据中定义协议有何意义?
协议是通信中设备或系统之间约定的规则集合,用于确保数据的传输和交换按照一定的方式进行。
2、面向连接的TCP套接字传输特性有3点,请分别说明。
- 传输过程数据不丢失
- 按序传输数据
- 传输的数据不存在数据边界
3、下列哪些是面向消息的套接字的特性? (a c e)
a.传输数据可能丢失
b.没有数据边界( Boundary )
c.以快速传递为目标
d.不限制每次传递数据的大小
e.与面向连接的套接字不同,不存在连接的概念