套接字概述
套接字是抽象出来的概念,是应用程序进行网络通信的接口,对套接字的操作最终都会调用内核中的网络驱动程序,对系统应用程序开发,内核驱动透明不可见,用户只需创建一个套接字(socket),调用套接字API即可使用网络进行通信,相当便捷;在linux系统中,套接字就是一个文件;一个套接字对应一个套接字地址结构,套接字地址结构包括:网络协议、本地IP地址、本地端口,远程IP地址、远程端口;
套接字地址结构
使用struct sockaddr(通用套接字地址结构)这个结构来存储套接字地址,结构定义如下:
struct sockaddr{
unsigend short sa_family; /*address族,AF_xxx*/
char sa_data[14]; /*14bytes的数组表示来表述套接字的端口号和IP地址*/
}
由于使用14字节大小的数组描述套接字的IP地址和端口号很不方便,程序员们又建立了另外一个相似的结构struct sockaddr_in,结构定义如下:
struct sockaddr_in
{
__SOCKADDR_COMMON(sin_); /*相当于sa_family_t sin_family;2 bytes*/
in_port_in sin_port; /*端口号,2 bytes*/
struct in_addr sin_addr; /*4bytes*/
unsigned char sin_zero[sizeof(struct sockaddr) - /*16-2-2-4 = 8*/
__SOCKADDR_COMMOM_SIZE -
sizeof(in_port_t) -
sizeof(struct in_addr)];
}
套接字三种类型
流式套接字
流式套接字提供可靠的、,面向连接的通讯流,如果你通过流式的套接字发送“3”,“2”,“1”,那么到达远程的数据顺序也是“3”,“2”,“1”;这是因为流式套接字使用TCP协议传输数据,保证了数据的可靠性和顺序性;Telnet和HTTP协议都是流式套接字的应用;
数据包套接字
数据包套接字是一种无连接的的服务,数据通过相互独立的报文进行传输,数据无需且不可靠,无差错处理和重传机制;因为数据包套接字使用UDP协议,UDP协议本身就是不可靠的;tftp是数据包套接字的应用;
原始套接字
原始套接字允许对底层的协议,如IP、ICMP协议直接访问,常用于对网络协议实现的测试,需要用到具体的TCP/IP协议层的知识,后续博文会总结原始套接字的使用;