关于高性能网络编程的一些知识
TCP层为了可靠性,还额外需要解决3个大问题:丢包(网络分组在传输中存在的丢失)、重复(协议层异常引发的多个相同网络分组)、延迟(很久后网络分组才到达目的地)。另外,是不是还有顺序。
涉及到滑动窗口和拥塞控制。重要的一点:TCP协议是保证了整体网络的性能的最优化。而不是本身端对端两点网络性能的最优化。
http://blog.csdn.net/russell_tao/article/details/9111769
本文讲述的网络编程头前冠以“高性能”,它是指程序员设计编写的服务器需要处理很大的吞吐量,这与简单网络应用就有了质的不同。因为:1、高吞吐量下,容易触发到一些设计上的边界条件;2、偶然性的小概率事件,会在高吞吐量下变成必然性事件。3、IO是慢速的,高吞吐量通常意味着高并发,如同一时刻存在数以万计、十万计、百万计的TCP活动连接。所以,做高性能网络编程不能仅仅满足于学会开源组件、中间件是如何帮我实现期望功能的,对于企业级产品来说,需要了解更多的知识。
原因在于:首先,SYN队列和ACCEPT队列都不是无限长度的,它们的长度限制与调用listen监听某个地址端口时传递的backlog参数有关。
所以,如TOMCAT等服务器会使用独立的线程,只做accept获取连接这一件事,以防止不能及时的去accept获取连接。
那么,为什么如Nginx等一些服务器,在一个线程内做accept的同时,还会做其他IO等操作呢?
这里就带出阻塞和非阻塞的概念。注:我的理解,一方面nginx后续处理都是异步的,所以很快能再次accept;另外nginx的accept应该也是设置成了nonblocking.
我刚给看了下之前的文章,对于listenfd也是可以设成 非阻塞的。
int setnonblocking(int fd) {
int old_option = fcntl(fd, F_GETFL);
int new_option = old_option | O_NONBLOCK;
fcntl(fd, F_SETFL, new_option);
return old_option;
}
另外,SO_REUSEADDR也是一个很重要的选项。
int flag = 1, len = sizeof(int);
if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &flag, len) == -1) {
perror(“socket”);
}
转载于:https://www.cnblogs.com/charlesblc/p/6495684.html
关于高性能网络编程的一些知识相关推荐
- c 开发服务器的性能,高性能网络编程(三):下一个10年,是时候考虑C10M并发问题了...
1.前言 在本系列文章的上篇中我们回顾了过云的10年里,高性能网络编程领域著名的C10K问题及其成功的解决方案(上篇请见:<高性能网络编程(二):上一个10年,著名的C10K并发连接问题> ...
- 高性能网络编程(一)----accept建立连接
最近在部门内做了个高性能网络编程的培训,近日整理了下PPT,欲写成一系列文章从应用角度谈谈它. 编写服务器时,许多程序员习惯于使用高层次的组件.中间件(例如OO(面向对象)层层封装过的开源组件),相比 ...
- 高性能网络编程(三):下一个10年,是时候考虑C10M并发问题了
1.前言 在本系列文章的上篇中我们回顾了过云的10年里,高性能网络编程领域著名的C10K问题及其成功的解决方案(上篇请见:<高性能网络编程(二):上一个10年,著名的C10K并发连接问题> ...
- 高性能网络编程总结及《TCP/IP Sockets编程(C语言实现) (第2版)》 代码下载(链接以及文件打包)
http://blog.csdn.net/column/details/high-perf-network.html http://blog.csdn.net/russell_tao/article/ ...
- 高性能网络编程--陶辉
1 高性能网络编程1-accept建立连接 编写服务器时,许多程序员习惯于使用高层次的组件.中间件(例如OO(面向对象)层层封装过的开源组件),相比于服务器的运行效率而言,他们更关注程序开 ...
- 高性能网络编程(一)----accept建立连接(陶辉)
http://blog.csdn.net/russell_tao/article/details/9111769 最近在部门内做了个高性能网络编程的培训,近日整理了下PPT,欲写成一系列文章从应用角度 ...
- 高性能网络编程(1)—accept建立连接(转载,作者:陶辉)
编 写服务器时,许多程序员习惯于使用高层次的组件.中间件(例如OO(面向对象)层层封装过的开源组件),相比于服务器的运行效率而言,他们更关注程序开发 的效率,追求更快的完成项目功能点.希望应用代码完全 ...
- linux高性能网络编程,Linux高性能网络编程的介绍
Linux高性能网络编程 一.课程目标 本次课程深入讲解Linux下的socket编程,并以此为基础,着重讨论如何提高网络服务端应用的性能,通过本次课程的学习,学员将收获以下方面的成果: 熟练使用so ...
- Linux系统编程——进程基础知识
Linux系统编程--进程基础知识 1.程序和进程 程序,是指编译好的二进制文件,在磁盘上,不占用系统资源(cpu.内存.打开的文件.设备.锁-) 进程,是一个抽象的概念,与操作系统原理联系紧密.进程 ...
最新文章
- linux设备支持ntfs类型U盘笔记
- [Java基础] Properties类的基本操作和介绍
- mysql存储引擎使用教程_mysql教程:如何写MySQL存储引擎
- 计算机统考第五次作业操作题,计算机基础第5次作业 第五章 Powerpoint知识题
- graphics | R语言的基础绘图系统(二)—— 绘图参数及par函数
- mac自带自动化java_java Mac自动化-java和ant环境搭建
- cron表达式解析 3秒执行一次
- Vscode配置ftp连接远程服务器
- 计算机导论论文含图,计算机导论(论文).doc
- LOAP引擎:clickhouse06:简单介绍几个JSON函数
- linux宕机故障分析案例,[文章]Linux宕机故障分析案例
- 新版标准日本语中级_第三十二课
- 新胖子公式(java)
- 批量导入手机通讯录_教你手机通讯录怎么批量导入联系人
- JS 实现数字转罗马数字
- docker--镜像
- Java中的23种设计模式
- matlab dcgain,MATLAB实现控制系统的时域分析
- NVIDIA 3D VISION 在戴尔Alienware/XPS系列上的使用
- 制作ipad iphone充电线