客户端服务端进程网络数据交互理解

本文解析了客户端与服务端网络连接的步骤,包括内网穿透、端口分配与操作系统在数据传输中的作用。讨论了操作系统与进程间的交互,如fd、缓冲区和信号量在IO模型中的运用。强调了不同IO模型和操作系统实现的差异对服务进程的影响。
摘要由CSDN通过智能技术生成

之前对于客户端及服务端之间的网络交互和操作系统如何将网络数据交给应用的,似懂非懂,最近看了点书,写一下自己的想法,如有错误,请指正,谢谢。

1.机器之间如何通过网络连接起来的?
如果我们有一台机器是在内网,要访问公网上的一个地址(不考虑域名和ip的转换只是单纯的ip端口访问),那么途中应该是经过内网的各个交换机或路由器,最终通过一个nat或napt转换,将我们内网的ip端口转为公网的一个ip端口,将请求发出,该数据包在公网经路由器流转,最终到目的服务器,目的服务器返回数据,将我们由napt转换后的公网的ip端口作为目的地址,将数据发回,数据到达napt服务,再根据数据流出时的转换映射关系,转为内网的真实ip端口,发回内网,再由内网路由找到客户服务器。至此,我们就完成了由一个内网ip访问公网服务的操作,这种操作是不能逆向的,因为是内网ip,无法被外界直接访问的。
2.端口问题?
我们由本地发起对外界的请求访问,ip是本机ip,但端口是由操作系统随机分配的,即可以认为,我们发出该请求的线程,调用操作系统发起对某地址的访问,则操作系统会提供一个空闲的端口,作为出发点,将线程的数据读到内核缓冲区后,挂起线程,将待发送数据交给网络的发送缓冲区,由其发送,在处理发送数据时,可能涉及到数据的拆分等操作,这些都是不需要进程参与的,进程只需要指定以什么发送方式(tcp|udp)向什么地址端口发送什么数据即可,剩下的操作系统完成,数据回来后,根据数据发送给的端口,我们就知道这个数据是发送给哪个线程的,再将数据交给线程即可,也就完成了数据的请求和接收工作。
3.操作系统和进程的交互
操作系统中的交互,一般就几样东西,fd,缓冲区,信号量。
fd是用于io的,不论是网络还是文件或控制台,都可以用fd标识,我理解可以认为,一次网络请求的交互,一个文件的读写都可以用io来唯一标识,即都可以想象成对一个唯一特定文件的读写,一个写,一个读,通过fd来区分,fd也不只限于文件,也可以是内存里的读写,没必要必须是落地到硬盘或局限于网络设置之类,也可以是虚拟的,只要 是操作系统明白就够了。
客户端的网络io,是发起时,操作系统分配端口,生成fd,标识该线程、端口号映射关系,并挂起线程,将网络请求数据从应用缓冲区复制到内核缓冲区,再由内核缓冲区复制到网络的发送缓冲区,等数据回来后,由网络的接收缓存区拿到的数据是有目的端口的,再根据该端口及协议,找到目标线程,将线程唤醒,线程唤醒后,调用操作系统命令,将数据复制到应用缓冲区,线程也就得到了请求返回的数据,完成了一次网络交互。完成后的close操作,会使操作系统自动的在合适时间关闭该端口号,以备后续使用。
服务器的网络io,是指定了端口号,并listen,操作系统拿到来自网络的请求数据后,根据目的端口号知道该请求是请求谁的,操作系统通过网络完成三次握手后,告知进程来了个新的请求并为该请求建了个fd,进程去根据该fd和这个请求来源即客户端交互。
4.操作系统和进程的io虽然分很多种,但实际都是对进程的影响,实际操作系统干的活都是一样的,只是不同的io模型函数不一样,有阻塞有异步,有的是单一fd,有的可以同时订阅n个fd的读写异常事件,阻塞的读写操作系统对该线程挂起,等数据准备好,再启动该线程,对于该线程来说,编写的代码是很简单的,异步的读写就要通过信号量来进行交互了,操作系统准备好数据后,将信号通知进程,进程对该信号进行处理,信号也不是很遥远的东西,kill就是一个信号,默认操作就是杀死进程,实际也是进程对kill信号的处理,定时也是信号,到了限定的时间,操作系统通知进程,进程也就开始指定定时任务。
5.io模型也是不断发展的结果,各个操作系统对于各种io的实现也有区别,特别是最新的io模型,可能各个操作系统版本实现不一,有的还不一定支持,也就造成了各种语言的io模型写出的服务进程的io模型滞后,没新的就是好的这种,各种io模型都有适合的土壤。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值