引出套接字
我们知道网络应用通信(应用层)的实质是进程之间的通信
如:两个主机(电脑)上的qq是通过电脑运行qq这个程序(进程)通过网络传输数据进行聊天
根据五层理论模型,应用层接收的是传输层的数据。
那么问题来了😁
1.传输层是直接连接的应用层嘛
2.一台主机上有很多进程,如何把传输层的数据发送到特定进程
这就引出了今天的主角——套接字(套接字API)
什么是套接字(套接字API)
在大多数教材上是没有对这两个概念区别的,所以我看书的时候怎么都不能给它下一个定义。其实这两个概念可以分开看
套接字:是传输层通信端点抽象,仅仅是一个名词
套接字API:网络编程接口(函数集合)
套接字与套接字API的关系:API创建了套接字,并完成了套接字的功能,所以一般教科书中不分这两者的概念
套接字的功能
从上图的可以看出,传输层真正连接的是套接字,通过套接字将数据发送给特定的进程
传输层如何标识套接字
通过ip地址+端口号标识套接字,套接字绑定了主机端口号
ip地址对应相应主机
进程监控相应端口
注意:一台主机上一个端口号只能对应一个进程,一个进程可以监控多个端口
所以网上给的定义:套接字=ip地址+端口号
ip地址及端口号会封装到传输层的数据(报文)中
调用套接字API
而这相关的操作通过调用套接字API完成
基于传输层协议TCP
基于传输层协议UDP
常用的Socket API函数
- scoket():创建并返回套接字
- bind():套接字绑定本地端口
仅仅介绍两个吧,其他函数通过上图就可以看出哪些在tcp或者udp中使用,哪些在客户机或者服务机上使用
套接字的分类
主要是根据传输层两个协议分的
1.流式套接字。基于TCP,TCP协议是将数据看作无记录无边界的字节流,实现数据无差错、无重复的传输。所以称接受此类数据的套接字为流式套接字,内设流量控制。
2.数据报套接字。基于UDP,数据包以独立的形式发送传输过程数据可能被丢失。所以称接收此类数据的套接字为数据报套接字。
3.原始套接字。该套接字允许对较低层协议(如IP或ICMP)进行直接访问。基本上很少用
为什么要有套接字(套接字API)
是为了支持开发人员开发基于网络通信的应用,所以OS提供了基于TCP或者UDP的应用程序编程接口,就是套接字(套接字API)
总结
套接字位于传输层及应用层之间,是一个应用编程接口,应用程序通过调用此接口进行传输接收数据。
我觉得弄懂了套接字及工作方式,两边的传输层及应用层就好理解了