socket套接字与TCP连接

2023-11-01

如何标识一个TCP连接

      对于TCP协议,成功建立一个新的链接,需要保证该TCPl连接中四个要素组合体的唯一性:客户端的IP、客户端的port、服务器端的IP、服务器端的port

    服务器端的同一个IP和port,可以和同一个客户端的多个不同端口成功建立多个TCP链接(与多个不同的客户端当然也可以),只要保证Server IP + Server Port + Client IP + Client Port这个组合唯一不重复即可。

     如果是客户端用同一个本地端口去连不同的两个服务器ip,连第二个时就会提示端口已被占用。但服务器的监听端口,可以accept多次,建立多个socket,connection。 当error为EAGAIN或者EWOULDBLOCK时代表套接字被标记为非阻塞,且当前没有可接收的连接。


套接字与TCP连接

     监听套接字就是个牵线指路的,你实质上是跟它指的那个人说话。因为你要找的那个人不可能随时等你来,而监听套接字就是专职等你来问,它回答你要找的人在哪,并唤醒你要找的人,于是通话就建立起来了,就像现实生活中的接线员一样。

     listen函数将一个套接字转化为监听套接字。监听套接字可以接受来自客户端的连接请求。服务器通过accept函数等待来自客户端的连接请求,请求先到达监听套接字 listenfd,并返回一个已连接套接字。利用 I/O 函数,这个 已连接套接字可以被用来与客户端进行通信。监听套接字,是服务器作为客户端连接请求的一个端点,它被创建一次,并存在于服务器的整个生命周期。已连接套接字是客户端与服务器之间已经建立起来了的连接的一个端点,服务器每次接受连接请求时都会创建一次已连接套接字,它只存在于服务器为一个客户端服务的过程中。无论是监听套接字,还是已连接套接字,都是只存在于服务器端。已连接套接字与监听套接字共用端口号。

     在IO连接建立后,客户端用发出连接的那个SOCKET向服务器发数据,是发给服务器新创建的已连接套接字SOCKET,而不是服务器的监听SOCKET。服务器的监听SOCKET永远只是用来接受连接请求。操作系统上端口号1024以下是系统保留的,从1024-65535是用户使用的。由于每个TCP连接都要占一个端口号,所以错误认为最多可以有60000多个并发连接。其实一个网卡对应一个IP地址,一个IP地址对应65535个端口,一个socket(addr, port)可以接受多个socket连接(accept)。一个端口只能被一个socket监听(listen)。最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制。这是因为系统为每个TCP连接被accept后都要创建一个连接套接字socket句柄,每个socket句柄同时也是一个文件句柄。


服务端的最大连接数

     在上述TCP连接中讲解了Server IP + Server Port + Client IP + Client Port这个组合标识一个连接。服务端通常固定在某个本地端口上监听,等待客户端的连接请求。如果不考虑地址重用(SO_REUSEADDR选项)的情况下,即使服务端端有多个网卡ip,本地监听端口也是独占的,因此服务端TCP连接四元组中只有Client IP + Client Port是可变的,因此服务端TCP最大连接为Client IP 数×Client Port数,对IPV4,不考虑ip地址分类等因素,最大TCP连接数约为2的32次方(ip数)×2的16次方(port数),也就是服务端端单机理论最大TCP连接数约为2的48次方。但是如上所述最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制。这是因为系统为每个TCP连接被accept后都要创建一个连接套接字socket句柄,每个socket句柄同时也是一个文件句柄。


修改服务端TCP的最大连接数

      ulimit -n 输出 的结果,说明对于一个进程而言最多能打开多少个文件,所以你要采用此默认配置最多也就可以并发上千个TCP连接。临时修改:ulimit -n 1000000,但是这种临时修改只对当前登录用户目前的使用环境有效,系统重启或用户退出后就会失效。永久修改:编辑/etc/rc.local,在其后添加如下内容:ulimit -SHn 1000000

      如果一个程序创建了一个socket,并让其监听80端口,其实是向TCP/IP协议栈声明了其对80端口的占有。以后,所有目标是80端口的TCP数据包都会转发给该程序(这里的程序,因为使用的是Socket编程接口,所以首先由Socket层来处理)。所谓accept函数,其实抽象的是TCP的连接建立过程。accept函数返回的新socket其实指代的是本次创建的连接,而一个连接是包括两部分信息的,一个是源IP和源端口,另一个是宿IP和宿端口。所以accept可以产生多个不同的socket,而这些socket里包含的宿IP和宿端口是不变的,变化的只是源IP和源端口。这样的话,这些socket宿端口就可以都是80,而Socket层还是能根据源/宿对来准确地分辨出IP包和socket的归属关系,从而完成对TCP/IP协议的操作封装。已连接套接字与监听套接字共用端口号。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

socket套接字与TCP连接 的相关文章

  • gethostbyname ()函数的使用

    gethostbyname 函数 根据主机名获取主机信息 用域名或者主机名获取地址 操作系统提供的库函数 函数原型 struct hostent gethostbyname const char hostname hostent结构体 st
  • 网络编程的几种I/O模式

    1 非阻塞I O 非阻塞I O 若想网络编程时调用I O函数不想让程序阻塞 需要使用I O复用技术 一个方法是poll 轮询 所谓轮询就是执行函数时 如果内核不能立即对应用的函数进行响应时 就返回给应用一个错误 而应用不停的循环调用该函数
  • libev学习系列之四:ev_loop事件循环

    libev学习系列之四 ev loop事件循环 版本说明 版本 作者 日期 备注 0 1 ZY 2019 5 31 初稿 目录 文章目录 libev学习系列之四 ev loop事件循环 版本说明 目录 一 前言 二 描述 三 例子 一 前言
  • getaddrinfo简单应用——取得IP地址

    转自 http biancheng dnbcw info linux 265956 html 一个域名可能对应好几个ip地址 a out www baidu com 115 239 210 27 115 239 211 112 getadd
  • 网络编程之网络丢包故障如何定位?如何解决?

    引言 本期分享一个比较常见的网络问题 丢包 例如我们去ping一个网站 如果能ping通 且网站返回信息全面 则说明与网站服务器的通信是畅通的 如果ping不通 或者网站返回的信息不全等 则很可能是数据被丢包了 类似情况想必大家都不陌生 针
  • P2P原理以及如何实现(整理)

    前言 这几天看了p2p的原理以及实现的demo 整理一下 一共分为三部分 第一是概念原理 第二是demo实现 第三是p2p协议相关以及分类 一 概念原理 比较全面的理解 https zhuanlan zhihu com p 30351943
  • URL中的+,空格,/,?,%,#,&,= 及转义处理

    URL出现了有 空格 等特殊符号的时候 可能在服务器端无法获得正确的参数值 如何是好 解决办法 将这些字符转化成服务器可以识别的字符 对应关系如下 URL中的特殊字符 有些符号在URL中是不能直接传递的 如果要在URL中传递这些特殊符号 那
  • gethostbyname()函数详解

    基本概念 gethostbyname 函数主要作用 用域名或者主机名获取地址 操作系统提供的库函数 以下的讨论基于linux环境 域名系统 Domain Name System DNS 主要用于主机名字与IP地址之间的映射 每个组织机构往往
  • Unix网络编程5种IO模型

    IO模型 用一幅图表示所支持的I O模型 纵向维度是 阻塞 Blocking 非阻塞 Non blocking 横向维度是 同步 异步 总结起来是四种模型 同步阻塞 同步非阻塞 异步阻塞 异步非阻塞 Unix网络编程 中划分出了 第五种 模
  • C# 序列化与反序列化几种格式的转换

    这里介绍了几种方式之间的序列化与反序列化之间的转换 首先介绍的如何序列化 将object对象序列化常见的两种方式即string和xml对象 第一种将object转换为string对象 这种比较简单没有什么可谈的 public string
  • TFTP协议下载实验

    include
  • Linux实现多进程服务端Socket通信

    目录 程序流程 程序实例 运行结果 本例主要是让服务器能够同时处理多个客户端的连接请求 程序流程 1 创建基本的套接字 并绑定地址信息 设置监听 2 循环accept来接收连接请求 每接收一个连接请求 就创建一个子进程 3 在子进程中进行客
  • day075:XML的约束:DTD约束文档、DTD约束文档的三种引入方法、DTD语法规则

    目录 一 DTD约束 1 什么是DTD约束 2 创建DTD约束文档的步骤 3 代码示例 4 引入DTD约束文档的三种方法 1 引入本地DTD约束文档 2 在xml文件内部引入 3 从网络引入dtd文件 二 DTD语法规则 DTD定义元素 标
  • linux socket非阻塞之connect 函数

    1 connect原型 include
  • 一起来学nginx(一)

    一起来学nginx 一 nginx概述 nginx是一款web服务器 相当于一个软件 除了nginx还有哪些web服务器 apche openresty nginx的优点 高并发 高性能 可扩展性好 nginx是模块化的 可靠性 热部署 在
  • 网络编程---TCP/UDP套接字编程原理

    本篇介绍的是Linux下的网络编程 故有些接口是不适用于Windows的 但是具体概念和实现方法是大体一致的 本篇重在讲解原理 具体实现请戳这里 gt UDP套接字编程实现 介绍 网络编程套接字 socket 也是进程间通信的一种方式 但是
  • 网络编程——软件架构、osi七层、TCP/UDP协议

    文章目录 一 网络编程是什么 二 软件架构 1 c s架构 2 b s架构 三 OSI七层 1 物理层 2 链路层 3 网络层 4 传输层 5 应用层 四 TCP UDP协议 1 TCP 2 UDP协议 一 网络编程是什么 一个完整计算机系
  • Java GUI编程——在线聊天室

    引言 综合应用Java的GUI编程和网络编程 实现一个能够支持多组用户同时使用的聊天室软件 该聊天室具有比较友好的GUI界面 并使用C S模式 支持多个用户同时使用 用户可以自己选择加入或者创建房间 和房间内的其他用户互发信息 文字和图片
  • Node.js开发入门—HTTP文件服务器

    HelloWorld示例只有演示意义 这次我们来搞一个实际的例子 文件服务器 我们使用Node js创建一个HTTP协议的文件服务器 你可以使用浏览器或其它下载工具到文件服务器上下载文件 用Node js实现的HTTP文件服务器 比我在Qt
  • DNS使用TCP与UDP

    DNS同时占用UDP和TCP端口53是公认的 这种单个应用协议同时使用两种传输协议的情况在TCP IP栈也算是个另类 但很少有人知道DNS分别在什么情况下使用这两种协议 先简单介绍下TCP与UDP TCP是一种面向连接的协议 提供可靠的数据

随机推荐

  • 第二回:艺术画笔见乾坤

    文章目录 第二回 艺术画笔见乾坤 一 概述 1 matplotlib的三层api 2 Artist的分类 二 基本元素 primitives 1 2DLines a 如何设置Line2D的属性 b 如何绘制lines 2 patches a
  • Gitl用户在组中有五种权限:Guest、Reporter、Developer、Master、Owner 解释

    Gitl用户在组中有五种权限 Guest Reporter Developer Master Owner 解释 Guest 可以创建issue 发表评论 不能读写版本库 Reporter 可以克隆代码 不能提交 QA PM可以赋予这个权限
  • 遥感图像语义分割比赛整理

    好久没有写博客了 最近有两篇论文的投稿 到年前就没啥时间 寒假期间参加了一个遥感图像分割的比赛 一次不是很成功的参赛 第一次参加这种比赛吧 过程十分坎坷 本来就是在初赛ddl前10天才找到队友 然后在成功组队的第三天 被队友鸽了 只剩下我c
  • 打破传统降噪技术 看网易云信在语音降噪的实践应用

    导读 随着音视频会议 娱乐互动直播 在线教育产品的火热发展 产品中令人愉悦的音效音质体验是必不可少的 文 飒飒 网易云信音视频算法工程师 但在音视频实时通信中 难免会遇到各种我们不希望出现的声音 例如电流声 键盘敲击声 嘈杂声等 这些统称为
  • mysql的一些操作

    修改mysql的字符集 在安装mysql5 0时可以设置好mysql的字符集 一般使用utf8的字符集 1 查看建立表 tablename 的sql语句 Show create table tablename 查看建立表 tablename
  • R数据类型

    2 2 1 向量向量是用于存储数值型 字符型或逻辑型数据的一维数组 执行组合功能的函数c 可用来创建向量 各类向量如下例所示 a lt c 1 2 5 3 6 2 4 b lt c one two three c lt c TRUE TRU
  • 多项式全家福(缺插值和点值)

    文章目录 写法 vector写有什么好处 vector写的时候注意什么 Dft 求逆 开二次根 取模 对数 前置技能 1 复合函数求导 2 ln函数求导 指数 前置技能 牛顿迭代 模板 写法 vector写有什么好处 1 分治NTT的时候不
  • 爬虫已经凉凉,再不学点数据分析,你真的Out了!

    不论你是运营 金融 产品 开发 数据分析能力不仅能够助力个人专业能力的提升 也可更加了解产品 在职场上走得更远 但市面上数据分析课普遍存在以下问题 乱 少 贵 所以 只要299的数据分析就业班 来了 价格优势 首期1折价仅需299元 内容全
  • [嵌入式开发模块]DS3231时钟芯片 驱动程序

    刚刚写完DS3231时钟芯片的驱动程序 这里开源出来供大家使用 需要的自取 先简单介绍下这个芯片 然后直接给驱动代码以及示例代码 DS3231简介 简介 DS3231是一款低成本 高精度I2C实时时钟 RTC 具有集成的温补晶体振荡器 TC
  • Java内存模型

    一 CPU的缓存结构 我们知道CPU的运算速度是很快的 因为从磁盘读取数据的速度严重影响着效率 所以才有了内存 但是即便是这样 内存的性能也远远跟不上CPU的运行速度 所以CPU的设计者开始在内部加入 高速缓存 SRAM 来解决CPU运算速
  • CPU性能测试分析MIPS、DMIPS

    一 what MIPS million instruction per second 表示每秒多少百万条指令 如 10MIPS 表示每秒一千万条指令 MIPS MHz 表示 CPU 在每 1MHz 的运行速度下可以执行多少个MIPS 如 1
  • 367W字!京东商城Java架构师设计的亿级高并发秒杀手抄笔记

    京东商城的亿级高并发秒杀系统到底是怎么设计的 我如果也想做一个电商APP该如何下手 带着这些问题 今天你将会在我这篇文章中找到答案 本篇将会从系统架构设计基本入门 数据库 缓存 消息队列 分布式服务 维护 实战 实操 这几个大的方面进行深入
  • Logstash将数据导入至MYSQL

    Logstash 版本 6 2 4 Logstash 经常做的事情 是将日志文件进行解析 并且导入至 ElasticSearch 中 但是目前碰到的问题是 怎么将数据导入至 DB 中 比如 MYSQL 这就需要下面这个神器了 JDBC ou
  • Ceph入门到静态-deep scrub 深度清理处理

    9 6 洗刷 REPORT DOCUMENTATION BUG 除了为对象创建多个副本外 Ceph 还可通过洗刷归置组来确保数据完整性 请参见第 1 3 2 节 归置组 了解有关归置组的详细信息 Ceph 的洗刷类似于在对象存储层运行 fs
  • 云计算的基础设施服务

    云计算 企业实施手册 中将云计算的基础设施即服务划分为3个类别 服务器服务 存储服务和网络连接服务 服务提供商可能会提供虚拟服务器实例 在这些实例上 用户可以安装和运行一个自定义的映像 持久性的存储是一种单独的服务 客户可以单独购买 最后
  • 【C语言】程序环境和预处理

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 一 编程常见的错误 二 程序的翻译环境和运行环境 1 翻译环境
  • 文字、字母以及数字的换行不换行问题总结

    实现页面的文字 字母的展示效果的时候 相信大家都会遇到过一些这样的要求 文字不能换行 要强制文字一行展示 或者是 字母不会自动换行 需要实现可以自动换行断句 等等诸如此类的要求 现在就这个文字 字母换不换行的问题 说说这三个css属性的巧妙
  • 产品冷思考:大而全or小而美如何选择?

    顾城诗曰 黑夜给了我黑色的眼睛 我却用它寻找光明 我喜欢黑夜 因为此时远离尘世的嘈杂 追求内心的宁静 躲进黑暗的角落里才真正的洞察内心 作为冒牌的产品经理 褪去一天的疲惫 没有繁琐的事务 不再面红耳赤的争论 不用违心的妥协 吹着凉风 冷静的
  • 请你说一下行级锁和表级锁的区别(或表级锁和行级锁的区别)

    本旨在学习记录 内容源自JavaGuide 作者在此基础上进行补充说明 整理论述 使其能以一种更为逻辑地清晰地方式表达出 请你说一下行级锁和表级锁的区别 的理解 更多适应于java面试回答 亦可作对请你说一下自己对行级锁和表级锁的简要了解
  • socket套接字与TCP连接

    如何标识一个TCP连接 对于TCP协议 成功建立一个新的链接 需要保证该TCPl连接中四个要素组合体的唯一性 客户端的IP 客户端的port 服务器端的IP 服务器端的port 服务器端的同一个IP和port 可以和同一个客户端的多个不同端