1.Socket与TCP/IP协议簇关系
数据链路层、网络层、传输层协议是在内核中实现。因此操作系统需要提供API(Application Programming Interface,应用程序编程接口)使得应用程序能够访问这些协议提供的服务。主要的一套API便是socket.
socket提供如下两点功能:
1.将应用程序数据从用户缓冲区中复制到TCP/UDP内核发送缓冲区,以交付内核来发送数据(例如下图中的send函数),或者将应用程序从内核TCP/UDP接收缓冲区中复制数据到用户缓冲区,以读取数据;
2.应用程序可以通过socket来修改内核中各层协议的某些头部信息或者其它数据结构,从而精细地控制底层通信的行为。
总的来说socket是一套通用的网络程序接口。
一个socket地址是一个IP地址和端口对(ip,port)。socket的主要基础API都定义在sysy/socket.h头文件中。另外,Linux提供了一套网络信息API,以实现主机名和IP地址之间的转换以及服务名称和端口号之间的转换,定义netdb.h头文件中。
2.通用socket地址
表示socket地址的是结构体sockaddr
sa_family成员是地址类型(sa-family_t)的变量。
3.专用socket地址
linux为各个协议簇提供了专门的socket地址
TCP/IP协议簇有sockaddr_in和sockaddr_in6两个socket地址结构体,分别用于IPv4和IPv6:
4.IP地址转换函数
5.创建socket
补充:type参数中还可以设置为SOCK_RAW或者SOCK_DGRAM,表示原始套接字。
协议栈的原始套接字从实现上可以分为“链路层原始套接字”和“网络层原始套接字”两大类。链路层原始套接字可以直接用于接收和发送链路层的MAC帧,在发送时需要由调用者自行构造和封装MAC首部。而网络层原始套接字可以直接用于接收和发送IP层的报文数据,在发送时需要自行构造IP报文头(取决是否设置IP_HDRINCL选项)。关于原始套接字请查看:(81条消息) 原始套接字_ox0080的博客-CSDN博客_原始套接字
6.命名socket
socket地址是第二三小节提到的结构体,而一个socket是指上一节提到的一个socket文件描述符。
7.监听socket