开发者社区> 异步社区> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

《UNIX网络编程 卷1:套接字联网API(第3版)》——8.9 服务器进程未运行

简介: 我们下一个要检查的情形是在不启动服务器的前提下启动客户。如果我们这么做后在客户上键入一行文本,那么什么也不发生。客户永远阻塞于它的recvfrom调用,等待一个永不出现的服务器应答。然而这是一个很好的例子,它要求我们更多地了解底层协议以理解网络应用进程将发生什么。
+关注继续查看

本节书摘来自异步社区《UNIX网络编程 卷1:套接字联网API(第3版)》一书中的第8章,第8.9节,作者:【美】W. Richard Stevens , Bill Fenner , Andrew M. Rudoff著,更多章节内容可以访问云栖社区“异步社区”公众号查看

8.9 服务器进程未运行

我们下一个要检查的情形是在不启动服务器的前提下启动客户。如果我们这么做后在客户上键入一行文本,那么什么也不发生。客户永远阻塞于它的recvfrom调用,等待一个永不出现的服务器应答。然而这是一个很好的例子,它要求我们更多地了解底层协议以理解网络应用进程将发生什么。

首先,我们在主机macosx上启动tcpdump,然后在同一个主机上启动客户,指定主机freebsd4为服务器主机。接着,我们键入一行文本,不过这行文本没有被回射。

macosx % udpcli01 172.24.37.94
hello, world            我们键入这一行
                    但没有任何内容回射回来

图8-10给出了tcpdump的输出。

screenshot

首先我们注意到,在客户主机能够往服务器主机发送那个UDP数据报之前,需要一次ARP请求和应答的交换。(我们把这个交换保留在tcpdump的输出中,是为了强调在IP数据报可发往本地网络上另一个主机或路由器之前,还是有可能出现ARP请求-应答的。)

我们从第3行看到客户数据报发出,然而从第4行看到,服务器主机响应的是一个"port unreach-able"(端口不可达)ICMP消息。(长度13是12个字符加换行符。)不过这个ICMP错误不返回给客户进程,其原因我们稍后讲述。客户永远阻塞于图8-8中的recvfrom调用。我们还指出ICMPv6也有端口不可达错误类型,类似于ICMPv4(见图A-15和图A-16),因此这里讨论的结果对于IPv6也类似。

我们称这个ICMP错误为异步错误(asynchronous error)。该错误由sendto引起,但是sendto本身却成功返回。回顾2.11节,我们知道从UDP输出操作成功返回仅仅表示在接口输出队列中具有存放所形成IP数据报的空间。该ICMP错误直到后来才返回(图8-10所示为4ms之后),这就是称其为异步的原因。

一个基本规则是:对于一个UDP套接字,由它引发的异步错误却并不返回给它,除非它已连接。我们将在8.11节讨论如何给UDP套接字调用connect。很少有人明白套接字最初实现时为什么做此设计决策。(实现内涵在TCPv2第748~749页讨论。)

考虑在单个UDP套接字上接连发送3个数据报给3个不同的服务器(即3个不同的IP地址)的一个UDP客户。该客户随后进入一个调用recvfrom读取应答的循环。其中有2个数据报被正确递送(也就是说,3个主机中有2个在运行服务器),但是第三个主机没有运行服务器。第三个主机于是以一个ICMP端口不可达错误响应。这个ICMP出错消息包含引起错误的数据报的IP首部和UDP首部。(ICMPv4和ICMPv6出错消息总是包含IP首部和所有的UDP首部或部分TCP首部,以便其接收者确定由哪个套接字引发该错误,如图28-21和图28-22所示。)发送这3个数据报的客户需要知道引发该错误的数据报的目的地址以区分究竟是哪一个数据报引发了错误。但是内核如何把该信息返回给客户进程呢?recvfrom可以返回的信息仅有errno值,它没有办法返回出错数据报的目的IP地址和目的UDP端口号。因此做出决定:仅在进程已将其UDP套接字连接到恰恰一个对端后,这些异步错误才返回给进程。

只要SO_BSDCOMPAT套接字选项没有开启,Linux甚至对未连接的套接字也返回大多数ICMP“destination unreachable”(目的地不可达)错误。图A-15中除代码为0、1、4、5、11和12之外的所有ICMP目的地不可达错误均被返回。

我们将在28.7节再次讨论UDP套接字上异步错误的这个问题,并给出一个使用我们自己的守护进程获取未连接套接字上这些错误的简便方法。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
超 38 万个 Kubernetes API 服务器暴露于互联网
超 38 万个 Kubernetes API 服务器暴露于互联网
0 0
小程序服务器api接口,百度智能小程序API 开放接口
小程序服务器api接口,百度智能小程序API 开放接口
0 0
kubernetes API服务器的安全防护
12.1.了解认证机制  启动API服务器时,通过命令行选项可以开启认证插件。 12.1.1.用户和组了解用户:   分为两种连接到api服务器的客户端:   1.真实的人   2.pod,使用一种称为ServiceAccount的机制 了解组:   认证插件会连同用户名,和用户id返回组,组可以一次性给用户服务多个权限,不用单次赋予,   system:unauthenticated组:用于所有认证插件都不会认证客户端身份的请求。
946 0
Ant Design Pro 关闭mock数据 改成使用服务器API
Ant Design Pro中默认是使用了mock数据的,由于在做项目之前没有学习过react dva redux umi这些基础组成知识,对我这个新手来说确实比较辣手. 首先修改config目录下config.
4182 0
基于Python3.X/阿里云云解析API运用于树梅派做家庭服务器的DDNS服务,使用ThreadTimer和sh服务
基于Python3.X/阿里云云解析API运用于树梅派做家庭服务器的DDNS服务 加入配置管理/日志管理/外网出口IP模块 本项目主要用于学习研究Python在linux下定时任务及将脚本注册成系统服务 本项目将呈现开箱即用的程度,满足广大树梅派爱好者基本所需 本项目依赖的库请自行安装 sudo .
3406 0
阿里云海外服务器中调用谷歌API吗?如果是海外服务器国内访问是不是有延迟?
阿里云海外服务器中调用谷歌API吗?如果是海外服务器国内访问是不是有延迟? 我想做一个在国内访问的网站,想部署在阿里云上,但是想在阿里云中调用谷歌提供的一些API,不知道阿里云的网络通不通?要选海外服务器?如果是海外服务器国内访问是不是有延迟? 以前看新闻说,谷歌有一些API资源也能在国内顺序访问得到了。
1501 0
API接口JWT方式的Token认证(上),服务器(Laravel)的实现
API接口JWT方式的Token认证(上),服务器(Laravel)的实现 最近在开发一个 Android 程序,需要做用户登录和认证功能,另外服务器用的是 Laravel 框架搭建的。
5959 0
+关注
异步社区
异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
文章
问答
文章排行榜
最热
最新
相关电子书
更多
CUDA Math API
立即下载
阿里云 API 精选手册(Alibaba Cloud API Playbook)
立即下载
重保场景及API安全指南
立即下载