1.并发TCP最大连接数

一个TCP连接有一个四元组唯一标识{local_ip, local_port, remote_ip, remote_port}
client端建立连接请求时,通常让系统分配一个空闲的本地端口,该端口是独占不共享的,端口类型是unsigned short,共65535个可用,所以client最大连接数为65535个。
server端固定绑定一个端口来等待client的连接请求,四元组中rempote_ip/remote_port是可变不受控制的,共2^32 * 2^16组合。
但并不代表一个server可以支持那么多连接,因为有系统上的限制。
每个socket都占用一个文件描述符,而一个进程能打开的描述符数目是有限制的,而且整个系统允许打开的文件数也是有限制的。另外TCP连接数也受服务器资源限制(内存/带宽)。
单进程文件数
ulimit -n//查看单进程允许打开的最大文件数
//修改一个进程文件数限制
修改/etc/security/limits.conf
soft nofile xxx
hard nofile xxx

全局(系统)文件数

cat /proc/sys/fs/file-nr  //显示已经分配的文件handle数、已分配但未使用的handle数、允许的最大handle数
修改/etc/sysctl.conf
fs.file-max=xxx
net.ipv4.ip_conntrack_max=xxx
net.ipv4.netfilter.ip_conntrack_max=xxx

考虑到文件描述符、系统资源、1024以下端口不能使用的限制,server端单机TCP连接数可以超过10w。

2.SYN Flood处理(TCP洪水攻击)

TCP攻击,利用众多的伪IP与服务发起TCP连接,当服务端向伪IP发送SYN/ACK时,一直收不到响应,会重试。导致半连接队列溢出,正常连接请求进不来。

  • 找到处于半连接状态(SYN_RECV)的IP,封掉持半连接多的IP
  • 关掉SYN+ACK的重发,默认是发送5次
tcp_synack_retries=0
  • 增大半连接队列长度
net.ipv4.tcp_max_syn_backlog = 200000
  • 开启SYN cookies。服务端不保存半连接,根据SYN计算出一个cookie值并作为SYN ACK包的初始序列号返回;当收到ACK(第三次握手)时从包头信息计算上次发送SYN ACK包时的cookie值,与该ACK对比,如果ACK==cookie+1,则分配资源建立连接。
net.ipv4.tcp_syncookies = 1

3.查看TCP连接状态

netstat -an | awk '/^tcp/{++S[$NF]}END{for (a in S)print a, S[a]}'

4.TCP端口号最大值

tcp/udp报文首部的原端口和目的端口都只有16位,所以最大是2^16 - 1 = 65535

Linux网络编程系列-常见疑惑的更多相关文章

  1. linux网络编程系列-TCP/IP模型

    ### OSI:open system interconnection ### 开放系统互联网模型是由ISO国际标准化组织定义的网络分层模型,共七层 1. 物理层:物理定义了所有电子及物理设备的规范, ...

  2. Linux 网络编程系列教程

    一.基础理论篇 01.网络协议入门 02.LAN.WAN.WLAN.VLAN 和 VPN 的区别 03.IP 地址介绍 04.广播地址介绍 05.无连接和面向连接协议的区别 06.因特网的IP协议是不 ...

  3. Linux网络编程系列-TCP传输控制

    滑动窗口(sliding window) 滑动窗口是用于流量控制的,发送端根据接收端的处理能力发送数据,不至于造成过多的丢包. 是发送方和接收方间的协调,对方的接收窗口大小就是自己的发送窗口大小. 在 ...

  4. linux网络编程系列-网络连接的建立

    一个比较实用的连接函数,支持host为域名. #include <netdb.h> #include <sys/socket.h> #include <sys/types ...

  5. Linux网络编程系列-TCP编程实例

    实例: client #include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #inc ...

  6. Linux网络编程系列-套接口选项控制

    获取和设置套接口选项的方法有: getsockopt/setsockopt fcntl ioctl getsockopt/setsockopt 这两个函数仅用于套接口(socket)的设置,另外两个函 ...

  7. 【linux草鞋应用编程系列】_5_ Linux网络编程

    一.网络通信简介   第一部分内容,暂时没法描述,内容实在太多,待后续专门的系列文章.   二.linux网络通信     在linux中继承了Unix下“一切皆文件”的思想, 在linux中要实现网 ...

  8. 猫哥网络编程系列:HTTP PEM 万能调试法

    注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...

  9. 猫哥网络编程系列:详解 BAT 面试题

    从产品上线前的接口开发和调试,到上线后的 bug 定位.性能优化,网络编程知识贯穿着一个互联网产品的整个生命周期.不论你是前后端的开发岗位,还是 SQA.运维等其他技术岗位,掌握网络编程知识均是岗位的 ...

随机推荐

  1. Android SwipeRefreshLayout 下拉刷新——Hi_博客 Android App 开发笔记

    以前写下拉刷新 感觉好费劲,要判断ListView是否滚到顶部,还要加载头布局,还要控制 头布局的状态,等等一大堆.感觉麻烦死了.今天学习了SwipeRefreshLayout 的用法,来分享一下,有 ...

  2. 【AutoMapper官方文档】DTO与Domin Model相互转换(上)

    写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...

  3. Java 输出流中的flush方法

    转自:http://blog.csdn.net/jiyangsb/article/details/50984440 java中的IO流中的输出流一般都有flush这个操作,这个操作的作用是强制将缓存中 ...

  4. 【原创分享·微信支付】 C# MVC 微信支付教程系列之扫码支付

    微信支付教程系列之扫码支付                  今天,我们来一起探讨一下这个微信扫码支付.何为扫码支付呢?这里面,扫的码就是二维码了,就是我们经常扫一扫的那种二维码图片,例如,我们自己添 ...

  5. Xamarin+Prism开发详解三:Visual studio 2017 RC初体验

    Visual studio 2017 RC出来一段时间了,最近有时间就想安装试试,随带分享一下安装使用体验. 1,卸载visual studio 2015 虽然可以同时安装visual studio ...

  6. JS继承之原型继承

     许多OO语言都支持两种继承方式:接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.如前所述,由于函数没有签名,在ECMAScript中无法实现接口继承.ECMAScript只支 ...

  7. Unity3D 5.3 新版AssetBundle使用方案及策略

    1.概览 Unity3D 5.0版本之后的AssetBundle机制和之前的4.x版本已经发生了很大的变化,一些曾经常用的流程已经不再使用,甚至一些老的API已经被新的API所取代. 因此,本文的主要 ...

  8. [原]Cachedb 网络模块文档

    Cachedb 网络模块文档 整体结构 多路复用 (epoll 模块) 事件驱动 (事件封装) 缓冲管理 (上层buffer管理) 设计思想 层次化的设计,每一个模块只调用上一个模块的接口,并将耦合聚 ...

  9. 【WPF】日常笔记

    本文专用于记录WPF开发中的小细节,作为备忘录使用. 1. 关于绑定: Text ="{Binding AnchorageValue,Mode=TwoWay,UpdateSourceTrig ...

  10. [转载]SQL语句中的日期计算

    1. 本月的第一天SELECT  DATEADD(mm,  DATEDIFF(mm,0,getdate()),  0) 2. 本月的最后一天SELECT  dateadd(ms,-3,DATEADD( ...