基本概念
套接字——应用层和传输层之间,提供应用传输接口
Web/RPC/中间件——应用层之上的网络开发
应用编程接口API(application programming interface)
套接字接口(socket interface)简称套接字,是一种API。
socket API
一个进程可能会创建多个套接字,不同的进程会创建自己的套接字。
当客户端创建套接字希望与服务端进行通信时,通过端口号来分辨与服务端的哪一个应用进程进行通信(为什么不通过IP地址进行分辨,因为服务端主机上有多个应用进程在运行,每个应用进程可能会使用多个套接字。单单通过IP地址不足以分辨出是与哪一个套接字进行通信)
套接字对内对外使用的管理机制不同
标识通信端点(对外)——IP地址+端口号——这是针对TCP/IP的
操作系统/进程如何管理套接字(对内)——套接字描述符(socket description)
一个进程创建一个套接字的时候,会返回一个套接字描述符。操作系统在管理内部套接字的时候,都是通过套接字描述符来引用的(操作系统使用套接字描述符来管理套接字的时候, 就是一种套接字抽象机制,这种抽象机制类似于文件的抽象。Unix操作系统对于套接字管理和文件管理,是一个管理,也就是说他把套接字看成是一个特殊的文件;Windows操作系统是分开管理的。)。
socket API函数
1、socket函数——创建套接字
调用socket函数成功之后,会返回一个套接字描述符(sd)
socket函数的三个参数:
1)、Protofamily)(协议族)——用于说明我的套接字面向哪种协议
2)、tyep(套接字类型)
3)、proto(协议号)
值为0代表用的是默认协议
例子——创建流套接字代码段
2、closesocket函数——关闭连接(Unix中的函数名是close,没有socket,记住)
3、bind函数——为套接字设置本地端点地址信息(即IP地址+端口号)
、
熟知端口号——web服务器就是80,sftp是25,以此类推
客户端一般不必调用bind函数
如果服务器有多个网卡,也就是有多个IP地址,该如何处理,绑定哪一个IP地址呢——使用地址IP体制通配符 INADDR_ANY
4、listen函数——服务端监听状态
5、connect函数——客户端
6、accept函数
当服务器调用accept,取走客户端的连接请求之后,就会创建新的套接字。真正与客户端创建连接的,就是这个新套接字。
7、send,sendto函数——用于发送数据
8、recv、recvfrom函数——用于接受数据
9、setsockopt、getsockopt——套接字参数设置和套接字参数读取
套接字面向TCP/IP可以创建的服务类型
应用层要通信,就要创建套接字。套接字假期了应用层和传输层的一个接口。
如果我创建的套接字的面向TCP的,就是流式套接字;如果是面向UDP而创建的套接字,就是数据报套接字;如果是直接面向网络层的套接字,则是原始套接字。
网络应用中Socket API(TCP)调用的基本流程
客户端软件的设计
1、解析各个功能函数
2、TCP客户端软件流程
3、UDP客户端软件流程