网络编程

宏哥分享的大作,不分享出来,就埋没了

本次分享主要针对TCP协议,不涉及UDP等其它网络协议。




网络编程的核心接口------》建立连接。数据收发

client使用connect发起连接,server端使用listen监听和accept建立连接。图里面少了一个重要的函数。socket——创建套接字,两边都要使用。

连接过程:backlog。在连接建立完毕之前的连接请求的个数。超过这个数值。则连接请求被拒绝

数据收发过程:每一个已连接的socket都有一个相应的发送缓冲区和接收缓冲区。当发送缓冲区满时,发送请求会被堵塞。当接收缓冲区空时。接收请求会被堵塞。

堵塞会引起线程/进程的切换,影响系统的总体的性能。

能够使用select、pool、epool来统一控制I/O,从而模拟一种非堵塞的模型。

仅仅有发送缓冲区有空余和接收缓冲区有数据时,才进行数据的收发,使得业务线程不会由于网络I/O而发生堵塞。

堵塞并不一定总比非堵塞低效,由于堵塞实际上是释放了处理器资源。因此假设并发的线程/进程比較多。临界区比較大的话,非堵塞机制会使得非工作的进程也争抢CPU时间片。

信号是Unix系统提供的机制。能够理解为软中断。能够用于进程间发送通知。




服务端和client的高效的编程模式。

服务端:使用非堵塞I/O,实现业务逻辑和I/O的解耦。提升服务的效率。

I/O模式:Reactor和Proactor,Proactor的模式会更高效一些。

要谨慎选择等待队列的大小,以免请求被无理的拒绝或者造成无谓的服务延迟。


RPC的核心是数据的跨平台的解析-》序列化与反序列话,一个统一的中间语言IDL至关重要。

为什么要Thrift与Protobuf?
RPC不可避免的须要序列化与反序列化工作。这样的工作简单可是繁琐,不仅每一个字段都要进行,并且要注意处理网络序和主机序。


原文地址:https://www.cnblogs.com/yjbjingcha/p/7133920.html