UNIX网络编程学习笔记(一)

大纲

习题

1.1 “按1.9节未尾的步骤找出你自己的网络拓扑的信息”

主要包含两个基本命令:netstat和ifconfig netstat -i提供网络接口的信息。我们还指定-n标志以输出数值地址,而不是试图把它们反向解析成名字。 可以看到本机是支持IPV6协议的。

netstat –r展示路由表:

执行ifconfig就可获得每个接口的详细信息

通过Ping命令找出本地网络中众多主机的IP地址,ping -b在mac环境下是不被支持的

Flood pinging is not recommended in general, and flood pinging the broadcast address should only be done under very controlled conditions.

1.2 “获取本书示例的源代码(见前言),编译并测试图1-5所示的TCP时间获取客户程序。运行这个程序若干次,每次以不同IP地址作为命令行参数。”

首先要找到一个支持DAYTIME协议的服务器地址: WIKI DAYTIME协议 服务器列表 随机选择一个进行访问:

“1.3 把图1-5中的socket的第一参数改为9999。编译并运行这个程序。结果如何?找出对应于所输出出错的errno值。你如何可以找到关于这个错误的更多信息?”

在Mac环境下编译是成功的,因为在Mac的c语言SDK中,第一个参数是整形。

“1.4 修改图1-5中的while循环,加入一个计数器,累计read返回大于零值的次数。在终止前输出这个计数器值。编译并运行你的新客户程序。”

这里需要深入思考的是,为什么可以一次就得到返回。 字符串:58979 20-05-10 11:36:16 50 0 0 857.5 UTC(NIST) *共计包含50个字符(算上末尾的换行符\r\n) 在ASCII规范中,一个字符包含一个字节。 结合一下MTU和MSS的定义,单次TCP传输可以容纳50个字符,所以一次就可以得到返回。当然这不是必定的。

MTU(最大传输单元)

MTU前面已经说过了,是链路层中的网络对数据帧的一个限制,依然以以太网为例,MTU为1500个字节。一个IP数据报在以太网中传输,如果它的长度大于该MTU值,就要进行分片传输,使得每片数据报的长度小于MTU。分片传输的IP数据报不一定按序到达,但IP首部中的信息能让这些数据报片按序组装。IP数据报的分片与重组是在网络层进完成的。

MSS(最大分段大小)

MSS是TCP里的一个概念(首部的选项字段中)。MSS是TCP数据包每次能够传输的最大数据分段,TCP报文段的长度大于MSS时,要进行分段传输。TCP协议在建立连接的时候通常要协商双方的MSS值,每一方都有用于通告它期望接收的MSS选项(MSS选项只出现在SYN报文段中,即TCP三次握手的前两次)。MSS的值一般为MTU值减去两个首部大小(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以如果用链路层以太网,MSS的值往往为1460。

“1.5 按下述步骤修改图1-9中的程序。首先,把赋于sin_port的端口号从13改为9999。然后,把write的单一调用改为循环调用,每次写出结果字符串的一个字节。编译修改后的服务器程序并在后台启动执行。接着修改前一道习题中的客户程序(它在终止前输出计数器值),把赋于sin_port的端口号从13改为9999。启动这个客户程序,指定运行修改后的服务器程序的主机的IP地址作为命令行参数。客户程序计数器的输出值是多少?如果可能,在不同主机上运行这个客户与服务器程序。”

这道题目的意义不明,9999端口并非规范,链接得到超时异常提示: