前景提要
上一篇文章说过网络收发功能是委托操作系统实现的,这里的委托就是指委托操作系统的协议栈,和DNS查询一样,建立连接和通信上层也需要使用到 Socket的,Socket用于提供计算机之间连接通信的管道,大致示意图如下所示:
上图表示收发数据的主要思路,那么要通信就需要先建立这条管道(也叫作连接)。
大致流程:
服务器启动的时候会创建套接字等待客户端连接,客户端在使用网络请求的时候创建套接字;操作系统去连接这两个套接字之间的管道;这样就可以收发数据了;当通信完毕后,服务器\客户端任意一方发起断开连接的请求,双方确认后删除套接字
****
上面这些操作都是通过Socket程序,可以看到Socket程序是用于连接协议栈和应用的桥梁,也就是Socket委托操作系统的协议栈,协议栈委托网卡,协议栈拿到之后返回socket,socket再返回给调用该函数的调用者
创建套接字
客户端调用Socket库创建套接字(和调用gethostByname一样),协议栈返回一个描述符给应用程序,应用程序保存这个描述符
描述符:用于区分不同的套接字,一台计算机有很多个应用程序,而应用程序又有很多不同的网络连接
对应于图中的1,套接字表示了本地ip地址端口,远端的ip地址端口,链接状态,正在使用这个套接字的应用程序信息。
连接服务器的套接字
使用创建套接字时协议栈返回的描述符和服务器的IP端口填入Socket程序连接方法的参数中,
- 描述符:协议栈通过描述符来判断使用哪个套接字进行链接操作
- 服务器IP地址:使用之前讲的通过DNS服务器将服务器域名转换为对应的IP地址
- 服务器端口:每个网卡(网络连接设备)对应一个ip地址,一台计算机有多个网卡因此会存在多个ip地址,那么端口是什么呢?是具体的通信的应用程序,和客户端一样,找到计算机之后有很多应用程序也有很多连接,但是具体使用服务器的哪个套接字进行连接呢?通过端口号(后面讲)就可以找到服务器通信要使用的是哪个套接字
端口号是提前设定好的,服务器是电子邮件时会使用25号端口;Web访问是使用80号端口
这样,客户端就知道和服务器的哪个套接字进行通信了,但是服务器还不知道和客户端的哪个套接字进行通信,因此在连接的过程中会使用客户端的套接字分配一个端口号告知服务器,这样双方就都知道各自的端口号也就是套接字了
链接成功后,保存对方和自己的ip地址,端口信息还有使用这个套接字的PID应用程序,连接状态等这些信息保存到套接字中
通信阶段
客户端发送数据
通过调用Socket程序的write方法将发送的数据放入这个方法的参数中即可,socket在委托协议栈发送数据,协议栈的TCP/IP模块或者UDP模块在委托网卡将数据切片发送给服务器;
服务器接受数据处理返回信息
服务器收到后也是一样的,通过端口号判断使用的套接字信息取出PID透传给应用程序去处理数据,并准备好处理结果提交给socket,socket利用协议栈,协议栈利用网卡将结果发送到客户端;
客户端读取服务器返回的信息
当客户端调用read方法指定一块数据缓冲区时,服务器返回的数据会写到这块缓冲区中。
断开连接
客户端或者服务端调用close程序进入断开连接阶段,管道会断开连接,套接字删除。
待优化点
每次访问Web时都需要经历这几个阶段并且一个网页中存在图片等信息时都会进行一次这样的操作,性能损耗不说还很浪费时间;因此后面出现了一次连接中可以请求多个信息
我正在参与2023腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表