【TCP/IP网络编程】:02套接字类型与协议设置

本篇文章主要介绍创建套接字函数相关的3个输入参数的含义,它们最终确定了套接字通信所采用的协议。同时,也简单对比了TCP和UDP传输方式的区别。

什么是协议?协议是对话中使用的通信规则,而在计算机领域则可解释为“计算机间对话的通信规则”。简言之,协议就是为了完成数据交换而约定的规则。

//创建套接字
#include <sys/socket.h>

int socket(int domain, int type, int protocol);
    -> 成功时返回文件描述符,失败时返回-1

  domain  套接字中使用的协议族信息

  type  套接字数据传输的类型信息

  protocol 计算机间通信使用的协议信息

协议族(Protocol Family)

协议族的类型信息分类如下,其中常用的如IPv4协议族信息PF_INET及IPv6协议族信息PF_INET6等

协议族类型

套接字类型

套接字类型指的是套接字通信的数据传输方式,常用的套接字类型有两种,即TCP传输类型SOCKET_STREAM,UDP传输类型SOCKET_DGRAM。书中举例的两幅漫画形象地解释了TCP和UDP数据传输的差异:

 TCP传输类型

上面提到了面向连接的套接字的一些特点,其中,比较容易验证的是第三点--传输的数据不存在数据边界,只需要调整通信双方write和read的次数不一致即可。那这一点又是如何做到的呢?-->收发数据的套接字内部有缓冲区,简言之就是字节数组。通过套接字传输的数据会保存到该字节数组中,只要不超出该字节数组的容量,则可待该字节数组填满之后通过一次read操作读取全部内容。

那如果套接字缓冲区已满是否意味着会发生数据丢失?并不会。由于面向连接套接字的安全机制,如果套接字缓冲区满,则传输端将停止传输;并且根据接收端的状态传输数据,如果传输出错还会提供重传服务。

TCP:“可靠、有序、基于字节的面向连接的数据传输方式”

UDP传输类型

 面向消息的套接字传输则恰好相反。其中,存在数据边界的特性意味着接受和传输数据的次数必须保持一致。

UDP:“不可靠、无序、基于报文的无连接的数据传输方式”

协议的最终选择

socket函数的第三个参数protocol确定了socket通信的最终协议。通常我们并不需要关注该参数,因为只要前两个参数确定,第三个参数便可唯一确定。此时只需将该参数置0即可,如IPv4协议族+TCP传输类型可确定第三个参数只能为IPPROTO_TCP;而IPv4协议族+UDP传输类型可确定第三个参数只能为IPPROTO_UDP。只有当同一协议族中存在多个数据传输方式相同的协议时,需特殊处理。

posted @ 2019-11-09 14:53  gloryd  阅读(338)  评论(0编辑  收藏  举报
levels of contents