socket的类型

很明显socket至少有两种,tcp和udp使用的是完全不同的两种类型的socket,使用c语言(posix)去创建socket的话,有三个参数需要正确选择

  1. int socket(int domain, int type, int protocol);

domain

直译是”域”;通常翻译是 协议域,这个参数也被称之为协议族(family);这个参数常用的有四个可选项:

  1. AF_INET
  2. AF_INET6
  3. AF_LOCAL(或称AF_UNIX,Unix域socket)
  4. AF_ROUTE

协议族的作用是,确定目的地的类型 ;
例如,如果指定了AF_INET,那么就一定需要一个32位的ip地址和一个16位的port;
AF_INET6则是需要一个ipv6的地址作为目的地的;
AF_UNIX,这个东西是一个本地socket,通常用于本地进程间通信,非常好用,它需要一个文件路径作为目的地类型;
AF_ROUTE是路由套接字,这个目前还没有接触过,如果以后有用到会单独介绍;

type

类型,socket的本身的类型(区别于domain参数,domain是协议类型)

  1. SOCK_STREAM
  2. SOCK_DGRAM
  3. SOCK_RAW
  4. SOCK_PACKET
  5. SOCK_SEQPACKET

最常用的其实是1和2,sock stream和sock dgram,分别翻译为流式套接字和数据报套接字;tcp采用的是流式套接字,而udp采用的是数据报套接字;(其实应该是stream基于tcp协议,而dgram基于udp协议)

protocol

就像字面含义,这个参数负责指定协议,常用的协议有以下几个

  1. IPPROTO_TCP
  2. IPPTOTO_UDP
  3. IPPROTO_SCTP
  4. IPPROTO_TIPC

使用最多的毫无疑问就是1和2….


请注意!socket的三个参数并不是能够随意搭配的!!!!


TCP and UDP

TCP 传输控制协议

大家都知道tcp协议是面向链接的,稳定的传输协议,这个稳定是相对于udp而言的,如果使用tcp进行数据传输,会经过以下几步:

  1. server创建socket A
  2. server绑定目标地址
  3. server监听

client:

  1. client创建socket
  2. client绑定目标地址
  3. client发起连接请求

我必须再次提醒看官们,对于server而言,真正的链接并不是scoket A ,当server进入监听之后,一旦有client对server发起了链接请求,server将会获取到一个socket B,而socket B才是真正用于数据通信的那个socket;然后server如果想要接收到数据需要进入recv状态,这部分暂且不谈;
所以明白什么叫做面向链接了吗?明白为什么稳定了吗?
因为server和client想要通信,必须要经过一个链接,双方确认的过程,client持有确定的socket,server也持有确认的socket,server知道client方有一个socket会给自己的socket发送数据,同时client也知道server方会有一个socket会接受自己发过去的消息;当然tcp还有数据确认机制,这个以后再说;

UDP 用户数据报协议

相对于tcp来讲,udp是不稳定的传输协议,使用udp的步骤如下
server:

  1. 创建socket
  2. 绑定地址
  3. 接受(这里的接受是receive from)

client:

  1. 创建socket
  2. 发送数据(sendto)

发现了吗,对于UDP来讲,并没有监听,请求链接,建立链接这个过程,server有一个目标地址,client只管向这个地址发送数据就行了,但是server的接受程序是不是在正常工作,有没有上线,这些问题对于client都是未知数;所以,server不知道client会不会发送数据过来,client也不知道server是不是正在接受数据,两个人都处在一个不是很负责的状态下,没有人去维护数据的发送和接受过程;因此我们说udp是不稳定的;