简单理解socket(AF_INET&SOCK_STREAM,SOCK_DGRAM)

套接字

在任何类型的通信开始之前,网络应用程序都必须创建套接字。

套接字最初是为同一主机上的应用程序所创建,使得主机上运行的一个程序(又名一个进程)与另一个运行的程序进行通信。这就是所谓的进程间通信(Inter Process Communication,IPC)

有两种类型的套接字:基于文件的和面向网络的。

基于文件的

家族名:AF_UNIX
(又名AF_LOCAL,在POSIX1.g标准中指定),它代表地址家族(addressfamily):UNIX。其他比较旧的系统可能会将地址家族表示成域(domain)或协议家族(protocolfamily),并使用其缩写PF而非AF。类似地,AF_LOCAL(在2000~2001年标准化)将代替AF_UNIX

面向网络的

家族名:AF_INET
或者地址家族:因特网。另一个地址家族AF_INET6用于第6版因特网协议(IPv6)寻址。此外,还有其他的地址家族,这些要么是专业的、过时的、很少使用的,要么是仍未实现的。在所有的地址家族之中,目前AF_INET是使用得最广泛的

总的来说,Python只支持AF_INET、AF_UNIX、AF_NETLINK和AF_TIPC家族

套接字地址:主机-端口对

做个比喻,套接字就像一个电话插孔,主机名和端口号就像区号和号码。
当程序之间需要通信时,需要知道对端的主机名(IP)和端口号。
有效的端口号范围为0~65535(小于1024的端口号预留给了系统)

面向连接的套接字与无连接的套接字

面向连接的套接字

  • TCP套接字的名字SOCK_STREAM。
  • 特点:可靠,开销大。
    在进行通信之前必须先建立一个连接,该连接的通信提供序列化的、可靠的和不重复的数据交付,而没有记录边界。这种类型的通信也称为虚拟电路或流套接字。
    实现这种连接类型的主要协议是传输控制协议(缩写 TCP)
    为了创建 TCP套接字,必须使用 SOCK_STREAM 作为套接字类型。

无连接的套接字

  • UDP套接字的名字SOCK_DGRAM
  • 特点:不可靠(局网内还是比较可靠的),开销小。
    与虚拟电路形成鲜明对比的是数据报类型的套接字,它是一种无连接的套接字。
    在通信开始之前并不需要建立连接。此时,在数据传输过程中并无法保证它的顺序性、可靠性或重复性。数据报确实保存了记录边界,这就意味着消息是以整体发送的,而并非首先分成多个片段。
    实现这种连接类型的主要协议是用户数据报协议(缩写 UDP)。为
    了创建UDP套接字,必须使用SOCK_DGRAM作为套接字类型。
    UDP套接字的SOCK_DGRAM名字来自于单词“datagram”(数据报)。
原文地址:https://www.cnblogs.com/yblackd/p/14533395.html