技术综合

97-ICMP 协议(端口不可达)

ICMP端口不可达是差错报文中的一种,它的类型(type)是3,代码(code)也是3.1.差错报文首部格式图1差错报文首部2.实验打开我们之前写的ICMP报文接收程序程序托管在gitos上:http://git.oschina.net/i...

96-ICMP 协议(时间戳请求与应答)

ICMP时间戳请求允许系统向另一个系统查询当前的时间。1.ICMP时间戳1.1首部格式图1ICMP时间戳请求与应答报文它的type字段为17(请求)或18(应答),code字段为0.发起时间戳:发送者的发送时间,由发送者填写接收时间戳:接收...

99-IPv4 地址

很久以前我们非常简单的讨论过《IPv4地址》,那时候是出于网络编程基础的需要,介绍了和IP地址相关的函数。这一次,我们来详细的讨论下IP地址的结构。1.IPv4地址分类1981年,标准就制定了一种基本的编址方法。32位的IP地址由{neti...

98-traceroute 程序

traceroute程序可以让我们看到IP数据报从一台主机传到另一台主机所经过的路由,该程序最早由VanJacobson实现。当然我们不可能原汁原味的模仿一遍traceroute程序,在这里,我们只需要把最关键的功能实现出来就算完成任务。1...

101-指向子网的广播

之前说过,子网广播地址格式为{subnetid,-1}。这里用-1表示主机位为全1.我们将用三个实验来观察现象。1.实验一1.1网络拓扑图图1网络拓扑1.2实验步骤在主机PC1上ping广播地址192.168.1.255,并在主机PC1上抓...

112-封装 recvFromFlags

在上一篇博文中,我们使用了recvmsg函数来获取标志位,但是每次填充structmsg结构体都相当费事,因此我们希望将这个过程封装成一个函数recvFromFlags,一劳永逸。除了获取标志位之外,我们还希望得到数据包是从哪个接口进来的,...

104-信号引起的竞争错误

1.引言之前我们学习过使用alarm信号这种奇技淫巧来实现带超时的IO函数,一直以来,我们写的这种程序都带有一个隐含的bug.举例来说,我们可能经常会写下面这样的代码:alarm(2);for(;;){addrlen=sizeof(clia...

105-多播(基础)

1.引言多播(或叫组播,Multicast)的出现,正是为了解决广播的不足。我们已经学会用udp发广播数据包,然而,对于不想接收广播数据包的主机来说,这就是一种骚扰。比如某主机接收到以太网帧(目的MAC地址为ff:ff:ff:ff:ff:f...

106-多播地址

1.多播地址多播地址,类似“QQ群号”,它是D类IP地址(224.0.0.0~239.255.255.255)。D类IP地址的首4位总是2进制1110开头,因此,可用的范围就只剩下后28位。这28位称为groupid——多播组ID,完整的3...

109-获取接口信息(一)

1.接口的其他信息上一篇文章简要的介绍了接口的名字和索引号的概念,我们也可以通过一些函数去获取、转换它们。可是,接口除了这些信息外,还有很多其它信息,比如接口上配置的ip地址啊,子网掩码啦,MTU等等。说了这么多,那要怎么才能获取到这些信息...

108-网络接口

1.接口网卡,是让计算机通向外部世界的一扇大门。但是在计算机的世界里,一般这扇门称为“接口(Interface)”。接口是物理意义上的设备。在Linux/Unix中,我们使用ifconfig命令来查看接口信息:图1接口信息接口通常都有自己的...

111-UDP 数据报被截断

1.数据报被截断有时候我们有这样的需求,在udp数据报传输的过程中,如果对方发过来的数据报很大,而我们的接收缓冲区不足以容纳这么大的数据报,怎么办?此时udp数据报就会被截断,有没有一种办法能判断数据报是否被截断呢?先来看看UDP数据报被截...