内核视角观察网络堆栈

内核视角观察网络堆栈

RPC(远程过程调用)是一种计算机通信协议,它允许一个程序(通常是在一个计算机或设备上运行)通过网络调用另一个计算机或设备上的远程程序,并获取其结果,就像调用本地程序一样。RPC是一种常见的分布式系统通信机制,被广泛用于构建分布式应用和服务。

RPC的基本过程如下:

客户端调用:客户端应用程序发起一个远程过程调用。客户端需要知道要调用的远程服务的地址(通常是IP地址和端口号)以及要调用的远程过程的标识符(通常是函数名或方法名)。

参数传递:客户端将调用远程过程所需的参数打包并通过网络发送给远程服务器。

网络传输:参数通过网络传输到远程服务器。这可能涉及底层的网络协议,如TCP/IP。

服务器接收:远程服务器接收到客户端发送的请求,然后解析请求以获取要调用的远程过程标识符和参数。

服务器调用:服务器执行请求的远程过程,使用收到的参数进行计算或处理。

结果返回:服务器将计算得到的结果打包并通过网络发送回客户端。

客户端接收:客户端接收到服务器返回的结果,并进行解析以获取最终的远程调用结果。

客户端处理:客户端根据需要对结果进行处理,可能继续执行其他操作或将结果展示给用户。

有几个关键内容可能是大家不清楚的,建立链接在client端并不是三次握手成功的时间,而是认为收到第二个ACK就认为链接建立成功了,接下来可以发送请求了。

发送请求过程当中,只要请求数据发送了,接下来的网络通信就在内核中自动化的运行了,这句话可能不是很好理解,可以分成以下几个事实来理解:

  • 操作系统IO基本上都是异步的,比如发送请求结束了,哪怕client没有去调用read读取数据,其实client也会不断地接收server端发送的response。如果通过抓包,能看到很多网络数据的往来,但是只要client没有调用read读到-1,client也不会执行四次挥手的动作。
  • 如果server端响应的response比较大,很有可能会出现的情况是,client端看到请求执行很慢,但是server端执行很快。为什么?因为server端的入口函数很快就完成了,慢在传输response上
  • 为什么传输大response很慢了,因为默认情况下,client与server的网络发送与接收buffer大概都是20K左右,当client发送请求之后,如果client没有去调用read函数读取数据,server响应的response会将client的socket buffer打满,也就是将20K左右撑满。然后当client调用read之后,client的socket buffer才会清空,才有更多的容量能够接受更多的response数据。这也就是说,如果没有调用read,那么我们很容易看到client的tcp 包里面会有zero window出现,告诉server,不要再次发送数据了。
  • 调整socket buffer大小,对于传送固定大小的response的速度正相关,socket buffer越大,传输越快。
  • spring boot embed tomcat有以下两个关键参数
    • socket.rxBufSize
    • socket.txBufSize
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值