欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

《TCP/IP网络编程》第2章 套接字类型与协议设置

程序员文章站 2022-07-01 07:55:21
...

套接字协议及其数据传输特性

1.       关于协议(Protocol)

    计算机间对话必备通信规则。

2.       创建套接字

#include <sys/socket>
int socket(int domain, int type, int protocol);

    -domain:套接字中使用的协议族(ProtocolFamily)信息;

    -type:套接字数据传输类型信息;

    -protocol:计算机间通信中使用的协议信息;

3.       协议族(Protocol Family)

  • PF_INET     ipv4
  • PF_INET6    ipv6
  • PF_LOCAL   本地通信的UNIX协议族

4.       套接字类型(Type)

    套接字类型指的是套接字的数据传输方式。Socket函数第一个参数PF_INET协议族中也存在多种数据传输方式。

套接字类型1:面向连接的套接字(SOCK_STREAM)

  • 传输过程中数据不会消失;
  • 按序传输数据;
  • 传输的数据不存在数据边界(Boundary)。

    收发数据的套接字内部有缓冲(buffer),即字节数组。通过套接字传输的数据将保存到该数组,因此,收到数据并不意味着马上调用read函数,只要不超过数组容量,则有可能在数据填充满后通过1次函数调用读取全部数据,也有可能分成多次read函数调用读取。

    读取速度较慢时,缓冲有可能被填满,此时套接字无法再接收数据,但即使这样也不会发生数据丢失,因为传输端套接字将停止传输。

    面向连接的套接字:可靠的、按序传递的、基于字节的面向连接的数据传输方式。

套接字类型2:面向消息的套接字(SOCK_DGRAM)

    面向消息的套接字比面向连接的套接字具有更快的传输速度,但无法避免数据丢失或损毁;另外,每次传输的数据大小具有一定的限制,并存在数据边界,存在数据边界意味着接收数据的次数应和传输次数相同。

    面向消息的套接字:不可靠的、不按序传递的、以数据的高速传输为目的的套接字。

5.       协议的最终选择

    传递前两个参数即可创建所需套接字,所以大部分情况下可以向第三个采纳数传递0,除非遇到以下这种情况:

    “同一协议族中存在多个数据传输方式相同的协议”(传输方式相同,但协议不同)

int tcp_socket = socket(PF_INET, SOCK_STREAM,IPPROTO_TCP);
int udp_socket = socket(PF_INET, SOCK_DGRAM,IPPROTO_UDP);