UNIX网络编程学习之一:socket的简介

一、什么是套接字(socket)

要回答第一个问题,首先需要对计算机的OSI网络分层有所了解:
  1. OSI参考原型
  2. TCP和SCTP的连接以及断开过程
  3. socket建立和断开连接的过程

二、OSI参考原型以及socket的简介

根据OSI参考原型,计算机网络可以分为物理层,数据链路层,网络层,传输层,会话层,表示层和应用层。这个计算机网络课程上都学过,与之相对应的就是实际的分层结构。在这个分层结构中:设备驱动,硬件和程序层包含了OSI中的物理层和数据链路层;IPv4和IPv6包含了网络层;TCP和UDP包含了传输层;其余层均由顶层应用程序来完成(不好意思,这里本身应该有一个图会更加直观的)。由于是分层结构,涉及到的一个问题就是层级之间的通信,而socket就是介于应用层和传输层的通信隧道。你可以把socket理解为电话通信中的电话线。通过socket这个媒介,应用层才能往传输层下发数据包,同时传输层也可以往应用层上发数据包。

2.1 OSI七层结构

Created with Raphaël 2.1.0 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层

2.2 应用中的网络分层

Created with Raphaël 2.1.0 应用层 传输层 网络层 设备驱动,硬件和程序

三、socket介绍

在计算机网络中,socket可以表示为一个四元组:
  {本机IP地址本机端口外机IP地址外机端口}
Socket又称”套接字”,应用程序通常通过”套接字”向网络发出请求或者应答网络请求。
以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。

四、连接过程

可以分为三个过程:连接监听,客户端请求以及连接确认三个阶段:
1. 连接监听:由于服务器不明确请求来自于哪一个客户端,所以需要监听来自不同客户端的请求,这个过程称为被动监听。
2. 客户端请求:客户端使用套接字请求服务器之前,会生成一个监听描述符,指向目标服务器的IP地址和端口。然后向服务器的套接字发送连接请求。
3. 连接确认:一旦服务器接受了客户端发来的监听描述符,就会响应客户端的连接请求,新建一个线程,将服务器端的套接字描述符发送给客户端。指出服务器端的IP地址和端口号。然后会继续回到监听状态,等待其他客户端的连接请求。

五、socket常用函数(参考了百度百科)

uint8_t socket(int domain, int type, int protocol) //这里的uint8_t是POSIX中的整型规范

domain:表示协议族。常用的协议族包括:AF_INET(IPv4),AF_INET6(IPv6)和AF_LOCAL(Unix域)和AF_ROUTER四种协议族。

type:指定Socket类型。常用的socket类型有SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等。流式Socket(SOCK_STREAM)是一种面向连接的Socket,针对于面向连接的TCP服务应用。数据报式Socket(SOCK_DGRAM)是一种无连接的Socket,对应于无连接的UDP服务应用。

protocol:指定协议。常用协议有IPPROTO_TCP、IPPROTO_UDP、IPPROTO_STCP、IPPROTO_TIPC等,分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议。
函数的返回值是一个整形数值,表示套接字描述符。创建失败返回INVALID_SOCKET,在UNIX中返回-1。

int bind(SOCKET socket, const struct sockaddr* address, socklen_t address_len)

参数说明:
socket:是一个套接字描述符。
address:是一个sockaddr结构指针,该结构中包含了要结合的地址和端口号。
address_len:确定address缓冲区的长度。
返回值:
如果函数执行成功,返回值为0,否则为SOCKET_ERROR

你可能感兴趣的:(网络编程)