connect和bind

2023-10-31

UDP:

考虑以下情形:我们使用UDP写一个echo程序,客户端模型:

while(fget())
{
	sendto();
	recvfrom();
}

如果服务器进程没有启动会如何?通过截包发现服务器响应一个icmp: port unreachable。不过这个ICMP错误不会返回给客户进程。原因稍后讲述。客户端永远阻塞在recvfrom调用。

我们称这个错误为异步错误。该错误由sendto引起,但是sendto本身却成功返回---因为我们知道UDP输出操作成功返回仅仅表示在接口输出队列中具有存放数据的空间。该ICMP在sendto返回之后才收到,这就是称为异步的原因。

一个基本规则是:对于一个UDP套接口,由他引发的异步错误并不返回给它,除非它已连接。我们后面将讲到如何给UDP套接口调用connect。

除非套接口是已连接的,否则异步错误不会返回到UDP套接口的。我们确实可以给UDP套接口调用connect,然而这样做的结果却与TCP连接大相径庭:没有三次握手。相反,内核只是检测是否存在立即可知的错误(如一个显然不可达的目的地),记录对端的IP地址和端口号,然后理解返回给调用进程。


从上图我们看到,任何来自非绑定的IP地址的数据报(???表示)不投递给这个已连接的套接口,因为他们要么源ip地址要不UDP端口不与该套接口connect到的协议地址相匹配。这些数据报肯能投递给同一个主机上的其他某个UDP的套接口,如果没有匹配的其他套接口,UDP将丢弃他们并生成相应的ICMP端口不可达错误。

小结:我们可以说UDP客户进程或服务器进程仅仅在使用自己的UDP套接口与确定的唯一对端通信时,才可以调用connect。调用connect的通常是UDP客户,不过有些网络应用中的UDP服务器会与单个客户长时间通信(TFTP),这种情况下,客户和服务器可能调用connect。


我们前面讲到,不进行connect的UDP客户端无法找到异步错误,我们如果改成connect的话,服务器进程没有开启,会返回错误。

while(fgets())
{
//connect的只用read就可以,不需要recvfrom
	write();
	read();
}

形式如下:

$hello,world

read error:Connection refused.

注:该ICMP错误由内核映射成ECONNREFUSED错误,相应于由err_sys(自己实现)输出消息串:Connection refused

TCP:

connect函数会激发TCP的三次握手过程,而且仅在连接成功或者出错才返回,其中出错返回可能有如下情况:

1.TCP客户没有收到SYN分节的响应,返回ETIMEDOUT错误。

模拟:比如我们客户连接本地子网一个不存在的IP地址,这样客户机发送ARP请求,永远收不到响应,connect超时。

2.若对客户的SYN响应是RST(表示复位),则表明该服务器主机在我们制定的端口上没有进程在等待与之相连(例如服务器进程没有运行)。这是一种硬错误,客户一接收到RST就马上返回ECONNREFUSE错误。

RST是TCP在发生错误时发送的一种分节。产生的三个条件:目的端口到达SYN,然而该端口没有监听的服务器进程(如前所述);TCP想取消一个已有连接;TCP收到一个根本不存在的连接上的分节。

3.若客户发出的SYN在中间的某个路由器上引发“destination unreachable"ICMP错误,则认为是软错误。客户主机内核保存该消息,并继续发送SYN,若一定时间还没收到响应,则保存的消息(ICMP错误)作为EHOSTUNREACH或者ENETUNREACH错误返回给进程。

模拟:连接一个因特网中不存在IP地址。

注:上面返回XXX错误给进程,其实就是将errno赋值,我们检测該值就可以获取错误类型。



下面稍微讲点Bind

进程可以把一个特定的ip直至捆绑到他的套接口。对于TCP客户,bind操作为该套接口上发送的数据指派源ip地址。不过TCP客户通常不指定捆绑特定ip。因为当连接套接口时,内核将根据所用外出网络接口来选择ip地址,而所用外出接口取决于到达服务器的路径。

对于ipv4来说,统配地址是INADDR_ANY。他告知内核去选择ip地址。

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

connect和bind 的相关文章

  • react的状态提升

    1 概念理解 在react中是单向数据流的设计 即 只有父组件可以传递数据给子组件 而没有子组件传递数据给父组件的概念 以正确的技术说明 是 拥有者组件 可以设置 被拥有者组件 中的资料 也就是主人与仆人的关系 那么子组件要传递数据给父组件
  • 宝塔 + SSRPanel 前端安装教程

    一 安装宝塔及环境 安装宝塔面板 登录 SSH 后 直接安装宝塔 yum install y wget wget O install sh http download bt cn install install sh sh install
  • 数据库定义语言(DDL)详解

    数据库定义预压 DDL 语言 是重要的语言之一 包含三个关键字 CREATE DROP ALTER 数据库语言都遵循巴科斯范式 其语言规范如下所示 L利用CREATE关键字可以实现定义 定义数据库 定义表 定义索引 定义视图等 常用的是建表
  • LOESS局部加权

    参考资料 1 Matlab中fLOESS函数 https ww2 mathworks cn matlabcentral fileexchange 55407 loess regression smoothing s tid srchtitl
  • node.js 做反向代理

    1 安装http proxy模块 npm install http proxy 2 使用http proxy模块启动代理服务器 导入http模块 var http require http 导入http proxy模块 var httpPr
  • C++设计模式(二)(摘录)

    C 设计模式 二 摘录 装饰模式 装饰模式 动态地给一个对象添加一些额外的功能 它是通过创建一个包装对象 也就是装饰来包裹真实的对象 新增加功能来说 装饰器模式比生产子类更加灵活 以下情形考虑使用装饰模式 需要扩展一个类的功能 或给一个类添
  • java之Thread类详细分析(全)

    目录 前言 1 属性值 1 1 线程属性方法 2 常用方法 3 使用方法 前言 Thread是程序中的执行线程 jvm并发地运行多个执行线程 1 属性值 通过查看Thread源码 是继承Runnable接口的实现类 无论使用Runnable
  • [Java]学习笔记

    一些JAVA的学习笔记 记录 主要是和C的不同点 https www runoob com java java tutorial html 声明数组变量 注意 建议使用 dataType arrayRefVar 的声明风格声明数组变量 da
  • 【多同步挤压变换】基于多同步挤压变换处理时变信号和噪声信号研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 2 1 算例1 2 2 算例2 2 3 算例3 2 4 算例4 2 5 算例5 3 参考文献

随机推荐

  • c++版本itk读取dicom序列

    读取dicom序列 hablee void readDicomSeries const std string dicom dir itk Image
  • .NET MVC+EF CodeFirst+IOC+EasyUI 框架设计教程(概述)

    一 开发环境 Win7 VS2013 C SQL Server2008 R2 二 总体源代码结构如下 说明 这个分层按个人理解 不一定要照我的 如果做过开发 会三层架构之类的理解起来就容易 01 Infrastructure 基础构件 Ne
  • QGIS批量将分幅遥感影像合并

    要在QGIS中编程实现批量将分幅遥感影像拼接成完整影像 可以按照以下步骤进行操作 1 首先 确保已经安装并正确配置了QGIS Python环境 并导入所需的库 以下是代码的导入部分 from qgis core import QgsProj
  • 常见的金融术语——176个基础金融知识名词解释

    基金类 1 开放式基金 open end funds 指基金规模不是固定不变的 而是可以随时根据市场供求情况发行新份额或被投资人赎回的投资基金 2 封闭式基金 close end funds 指基金规模在发行前已确定 在发行完毕后及规定的期
  • 解决文字自动换行,字母、数字不换行问题

    添加css属性word break break all
  • mysql修改root密码的语句

    ALTER USER root localhost IDENTIFIED WITH mysql native password BY 新密码 其中 localhost 字符 有的小伙伴可能遇到过无法通过navicat连接Linux中的MyS
  • 单点登录SSO:可一键运行的完整代码

    单点登录方案不同于一个普通站点 它的部署比较繁琐 涉及到好几个站点 要改host 安装证书 配置HTTPS 看到的不少这方面示例都是基于HTTP的 不认同这种简化 1 它体现不出混合HTTP HTTPS时 单点注销要注意处理的问题 2 做单
  • 【Node.js】下载安装及简单使用

    说起Node js 它是当前市面上非常受欢迎的框架 允许我们使用JavaScript搭建后端应用 它有着种种优点 诸如 非阻塞I O 事件驱动 跨平台 高性能 单线程 等等等等 不过现在我们不必执拗与关心这些优点的含义 当务之急是先上手他
  • conda加速设置

    Conda作为使用最为便捷的python环境管理工具 可以协助我们很方便的下载安装第三方库 软件包等操作 但其在下载资源的过程中速度不言而喻 尤其是在更换国内源的情况下 下载速度没有实质性的改变是很令人头疼的一件事 Mamba 树眼镜蛇 能
  • (tensorflow学习)用Object Detection API实现摄像头实时物体检测

    对于物体识别 谷歌已经有训练好的模型供我们使用 图方便不想自己训练的可以直接使用 说实话 装这个tensorflow真心麻烦 我建议用anaconda环境搭建 还要注意装的话装1 几的版本就可 用gpu跑的话注意显卡型号和版本是否兼容 真是
  • 【C++】内存管理

    目录 一 C C 内存分布 二 C语言中动态内存管理方式 三 C 中动态内存管理 1 开辟空间 2 释放空间 四 operator new与operator delete函数 五 内存泄漏 1 什么是内存泄漏 2 如何避免内存泄漏 总结 一
  • Python的getattr方法

    getattr是Python中的内置函数 用于获取一个对象的属性值 这个函数是动态获取属性的一种方式 特别适用于你事先不知道要获取哪个属性 或者属性名是在运行时确定的情况 使用方法 getattr object name default o
  • 资产安全 错题点

    数据所有者 1 决定谁有权访问信息系统 2 对资产负有最终责任 PS 对资产负有最终责任的 高级管理层 数据所有者 首选管理层 3 行为规则 制定规则 以便用于主体的数据或信息的适当使用及保护 4 决定数据的级别 每年回顾确保数据分级的正确
  • 【国产化踩坑记】openEuler系统安装,nvidia驱动,cuda,anaconda安装步骤记录

    1 openEuler安装步骤 尝试安装了openEuler20 03和22 03两个版本 在摸索的过程中总结了一下步骤 以及相关问题的解决方案 进行简单记录 便于后续使用 1 openEuler20 03安装步骤 网络配置以及可视化操作界
  • Segmentation fault (core dumped) 错误的一种解决场景

    错误类型 Segmentation fault core dumped 产生原因 Segmentation fault 段错误 Core Dump 核心转储 是操作系统在进程收到某些信号而终止运行时 将此时进程地址空间的内容以及有关进程状态
  • Springboot+Axios双token解决token过期续签问题

    后端分离使用token进行登录验证时 由于token存在过期时间 每次token过期都需要用户重新登录的话 用户体验很不友好 假如token能跟session一样 如果用户持续在进行操作 就自动延长有效时间 就可以解决问题 但是 token
  • qt利用腾讯云服务器实现不同局域网的通信(tcp)

    网上大多数关于qt通信的文章都是同一局域网通信 这种根本没有达到自己想象中的那种通信的要求 不同局域网的通信 这里用到的方法是客户端发送消息给服务器 然后服务器再发送给另一个局域网的客户 首先我们需要购买一个腾讯云服务器 并在自己电脑登录腾
  • Python记11(网络传输大文件

    客户端 import socket tqdm os 传输数据分隔符 separator
  • log4j2入门(三) PatternLayout输出格式详解

    摘要 本节介绍Log4j的输出格式的详细说明 1 PatternLayout参数 charset 指定字符集 pattern 指定格式 alwaysWriteExceptions 默认为true 输出异常 header 可选项 包含在每个日
  • connect和bind

    UDP 考虑以下情形 我们使用UDP写一个echo程序 客户端模型 while fget sendto recvfrom 如果服务器进程没有启动会如何 通过截包发现服务器响应一个icmp port unreachable 不过这个ICMP错