网络考点

TCP状态转换

TCP报文设计

TCP粘包问题

TCP拥塞控制,滑动窗口机制

HTTP报文内容

recv/send函数

IP选路

RIP和OSPF的区别:跳数,支持子网,收敛速度,考虑网络延迟和链路开销,区域的概念。

 

==============================================================================

《计算机网络》知识点大纲

讲讲滑动窗口机制

关于time_wait为什么等待2MSL才关闭,如果有大量time_wait状态连接会出现什么问题?

 
 

TCP/IP详解》

TCP/IP:四层协议系统。

链路层:有时也称作数据链路层或者网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。他们一起处理与电缆的物理接口细节。

 

网络基础概念

ARP(地址解析协议),请用简单语言说明其的工作原理。

1. 首先,每台主机都会在自己的ARP缓冲区 (ARP Cache)中建立一个 ARP列表,以表示IP地址和MAC地址的对应关系。

2. 当源主机需要将一个数据包要发送到目的主机时,会首先检查自己 ARP列表中是否存在该 IP地址对应的MAC地址,

        如果有,就直接将数据包发送到这个MAC地址;如果没有,就向本地网段发起一个ARP请求的广播包,查询此目的

        主机对应的MAC地址。此ARP请求数据包里包括源主机的IP地址、硬件地址、以及目的主机的IP地址。

3. 网络中所有的主机收到这个ARP请求后,会检查数据包中的目的IP是否和自己的IP地址一致。如果不相同就忽略此

        数据包;如果相同,该主机首先将发送端的MAC地址和IP地址添加到自己的ARP列表中,如果ARP表中已经存在该IP

        的信息,则将其覆盖,然后给源主机发送一个 ARP响应数据包,告诉对方自己是它需要查找的MAC地址;

4. 源主机收到这个ARP响应数据包后,将得到的目的主机的IP地址和MAC地址添加到自己的ARP列表中,并利用此信息

        开始数据的传输。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。

 

DNS是指( 域名系统Domain Name System)。请用简单语言描述其工作原理。

当 DNS 客户机需要查询程序中使用的名称时,它会查询 DNS 服务器来解析该名称。 

客户机发送的每条查询消息都包括3条信息,以指定服务器应回答的问题。 1 指定的 DNS 域名,表示为完全合格的域名 (FQDN) 。 2 指定的查询类型,它可根据类型指定资源记录,或作为查询操作的专门类型。     3 DNS域名的指定类别。

 

 

TCP/IP协议每一层有哪些功能?为什么要有网络层?

网络接口层:物理层是定义物理介质的各种特性;

数据链路层是负责接收IP数据包并通过网络发送,或者从网络上接收物理帧,抽出IP数据包,交给IP层。

常见的接口层协议有:Ethernet 802.3、Token Ring 802.5、X.25、Frame relay、HDLC、PPP ATM等。

网络层

负责相邻计算机之间的通信。

其功能包括三方面:

一、处理来自传输层的分组发送请求,收到请求后,将分组装入IP数据报,填充报头,选择去往信宿机的路径,然后将数据报发往适当的网络接口。

二、处理输入数据报:首先检查其合法性,然后进行寻径--假如该数据报已到达信宿机,则去掉报头,将剩下部分交给适当的传输协议;假如该数据报尚未到达信宿,则转发该数据报。

三、处理路径、流控、拥塞等问题。

网络层包括:IP(Internet Protocol)协议、ICMP(Internet Control Message Protocol)控制报文协议、 

                     ARP(Address Resolution Protocol)地址转换协议、RARP(Reverse ARP)反向地址转换协议。

IP是网络层的核心,通过路由选择将下一条IP封装后交给接口层。IP数据报是无连接服务。

ICMP是网络层的补充,可以回送报文。用来检测网络是否通畅。

Ping命令就是发送ICMP的echo包,通过回送的echo relay进行网络测试。

ARP是正向地址解析协议,通过已知的IP,寻找对应主机的MAC地址。

RARP是反向地址解析协议,通过MAC地址确定IP地址。比如无盘工作站,还有DHCP服务。

传输层

提供应用程序间的通信。

其功能包括:一、格式化信息流;二、提供可靠传输。为实现后者,传输层协议规定接收端必须发回确认,并且假如分组丢失,必须重新发送,即耳熟能详的“三次握手”过程,从而提供可靠的数据传输。

传输层协议主要是:传输控制协议TCP(Transmission Control Protocol)和用户数据报协议UDP(User Datagram protocol)。

应用层

向用户提供一组常用的应用程序,比如电子邮件、文件传输访问、远程登录等。远程登录TELNET使用TELNET协议提供在网络其它主机上注册的接口。TELNET会话提供了基于字符的虚拟终端。文件传输访问FTP使用FTP协议来提供网络内机器间的文件拷贝功能。

应用层协议主要包括如下几个:FTP、TELNET、DNS、SMTP、NFS、HTTP。

FTP(File Transfer Protocol)是文件传输协议,一般上传下载用FTP服务,数据端口是20H,控制端口是21H。

Telnet服务是用户远程登录服务,使用23H端口,使用明码传送,保密性差、简单方便。

DNS(Domain Name Service)是域名解析服务,提供域名到IP地址之间的转换,使用端口53。

SMTP(Simple Mail Transfer Protocol)是简单邮件传输协议,用来控制信件的发送、中转,使用端口25。[1]

NFS (Network File System)是网络文件系统,用于网络中不同主机间的文件共享。

HTTP(Hypertext Transfer Protocol)是超文本传输协议,用于实现互联网中的WWW服务,使用端口80。

 

邮件系统:

简单邮件传输协议(SMTP)是一种基于文本的电子邮件传输协议,是在因特网中用于在邮件服务器之间交换邮件的协议。SMTP是应用层的服务,可以适应于各种网络系统。

SMTP的命令和响应都是基于文本,以命令行为单位,换行符为CR/LF。响应信息一般只有一行,由一个3位数的代码开始,后面可附上很简短的文字说明。

SMTP要经过建立连接、传送邮件和释放连接3个阶段。具体为:

(1)建立TCP连接。

(2)客户端向服务器发送HELLO命令以标识发件人自己的身份,然后客户端发送MAIL命令。

(3)服务器端以OK作为响应,表示准备接收。

(4)客户端发送RCPT命令。

(5)服务器端表示是否愿意为收件人接收邮件。

(6)协商结束,发送邮件,用命令DATA发送输入内容。

(7)结束此次发送,用QUIT命令退出。

SMTP服务器基于DNS中的邮件交换(MX)记录路由电子邮件。电子邮件系统发邮件时是根据收信人的地址后缀来定位邮件服务器的。SMTP通过用户代理程序(UA)完成邮件的编辑、收取和阅读等功能;通过邮件传输代理程序(MTA)将邮件传送到目的地。

UDP

UDP是传输层协议,和TCP协议处于一个分层中,但是与TCP协议不同,UDP协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议。

        UDP协议是英文UserDatagramProtocol的缩写,即用户数据报协议,主要用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的C/S模式的网络应用都需要使用UDP协议。UDP协议直接位于IP(网际协议)协议的顶层。

 

特点:

1)无连接,发送数据之前不需要建立连接。开销和发送之前的时间延迟较短。

2)尽最大努力交付。(可以采取一定策略实现可靠传输)

3)面向报文,UDP对应用程序交付的报文,添加UDP首部后直接交给IP层。不合并,不拆分。

4)没有拥塞控制,网络拥塞不会使源主机发送率降低。

5)UDP支持一对一,一对多,多对一的交互通信

6)UDP首部开销较小,8字节(TCP为20字节、IP为20字节)

二,UDP首部格式(8字节)

         源端口:2字节 = 16bit =0 ~ 65535

         目的端口:2字节

         长度:2字节 用户数据包的长度(最短为8字节,仅有头部)

         检验和:2字节

三,常见问题

         1,如果接受方UDP发现收到报文中目的端口不正确(不存在对应端口的应用程序)怎么办?

               丢弃该报文,由ICMP发送“端口不可达”差错报文给发送方。

               traceroute 工作原理,一种利用ICMP的TTL,另一种利用UDP的端口

Send函数和Recv函数解析

1. send函数

int send( SOCKET s, const char FAR *buf, int len, int flags );

不论是客户端还是服务器端应用程序都用send函数来向TCP连接的另一端发送数据。

客户端程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。

该函数的:

第一个参数指定发送端套接字描述符;

第二个参数指明一个存放应用程序要发送数据的缓冲区;

第三个参数指明实际要发送的数据的字节数;

第四个参数一般置0。

这里只描述同步Socket的send函数的执行流程。当调用该函数时,send先比较待发送数据的长度len和套接字s的发送缓冲的长度,如果len大于s的发送缓冲区的长度,该函数返回SOCKET_ERROR;如果len小于或者等于s的发送缓冲区的长度,那么send先检查协议 是否正在发送s的发送缓冲中的数据,如果是就等待协议把数据发送完,如果协议还没有开始发送s的发送缓冲中的数据或者s的发送缓冲中没有数据,那么 send就比较s的发送缓冲区的剩余空间和len,如果len大于剩余空间大小send就一直等待协议把s的发送缓冲中的数据发送完,如果len小于剩余 空间大小send就仅仅把buf中的数据copy到剩余空间里(注意并不是send把s的发送缓冲中的数据传到连接的另一端的,而是协议传的,send仅仅是把buf中的数据copy到s的发送缓冲区的剩余空间里)。如果send函数copy数据成功,就返回实际copy的字节数,如果send在copy数据时出现错误,那么send就返回SOCKET_ERROR;如果send在等待协议传送数据时网络断开的话,那么send函数也返回SOCKET_ERROR。

要注意send函数把buf中的数据成功copy到s的发送缓冲的剩余空间里后它就返回了,但是此时这些数据并不一定马上被传到连接的另一端。如果协议在后续的传送过程中出现网络错误的话,那么下一个Socket函数就会返回SOCKET_ERROR。(每一个除send外的Socket函数在执 行的最开始总要先等待套接字的发送缓冲中的数据被协议传送完毕才能继续,如果在等待时出现网络错误,那么该Socket函数就返回 SOCKET_ERROR)

注意:在Unix系统下,如果send在等待协议传送数据时网络断开的话,调用send的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。

Send函数的返回值有三类:

(1)返回值=0:

(2)返回值<0:发送失败,错误原因存于全局变量errno中

(3)返回值>0:表示发送的字节数(实际上是拷贝到发送缓冲中的字节数)

 

错误代码:

EBADF 参数s 非合法的socket处理代码。

EFAULT 参数中有一指针指向无法存取的内存空间

ENOTSOCK 参数s为一文件描述词,非socket。

EINTR 被信号所中断。

EAGAIN 此操作会令进程阻断,但参数s的socket为不可阻断。

ENOBUFS 系统的缓冲内存不足

ENOMEM 核心内存不足

EINVAL 传给系统调用的参数不正确。

 

2. recv函数

int recv( SOCKET s, char FAR *buf, int len, int flags );

不论是客户端还是服务器端应用程序都用recv函数从TCP连接的另一端接收数据。

该函数的:

第一个参数指定接收端套接字描述符;

第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;

第三个参数指明buf的长度;

第四个参数一般置0。

这里只描述同步Socket的recv函数的执行流程。当应用程序调用recv函数时,recv先等待s的发送缓冲 中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR,如果s的发送缓冲中没有数 据或者数据被协议成功发送完毕后,recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数据,那么recv就一直等待,只到 协议把数据接收完毕。当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copy到buf中(注意协议接收到的数据可能大于buf的长度,所以 在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。recv函数仅仅是copy数据,真正的接收数据是协议来完成的),recv函数返回其实际copy的字节数。如果recv在copy时出错,那么它返回SOCKET_ERROR;如果recv函数在等待协议接收数据时网络中断了,那么它返回0。

注意:在Unix系统下,如果recv函数在等待协议接收数据时网络断开了,那么调用recv的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。

 

默认情况下socket是阻塞的。

阻塞与非阻塞recv返回值没有区别,都是:

<0 出错

=0 对方调用了close API来关闭连接

>0 接收到的数据大小,

 

特别地:返回值<0时并且(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情况下认为连接是正常的,继续接收。

只是阻塞模式下recv会一直阻塞直到接收到数据,非阻塞模式下如果没有数据就会返回,不会阻塞着读,因此需要循环读取)。

 

返回说明:

(1)成功执行时,返回接收到的字节数。

(2)若另一端已关闭连接则返回0,这种关闭是对方主动且正常的关闭

(3)失败返回-1,errno被设为以下的某个值

EAGAIN:套接字已标记为非阻塞,而接收操作被阻塞或者接收超时

EBADF:sock不是有效的描述词

ECONNREFUSE:远程主机阻绝网络连接

EFAULT:内存空间访问出错

EINTR:操作被信号中断

EINVAL:参数无效

ENOMEM:内存不足

ENOTCONN:与面向连接关联的套接字尚未被连接上

ENOTSOCK:sock索引的不是套接字

TCP/IP协议

TCP/IP结构对应OSI

OSI中的层

功能

TCP/IP协议族

应用层

文件传输,电子邮件,文件服务,虚拟终端

TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等

表示层

翻译、加密、压缩

没有协议

会话层

对话控制、建立同步点(续传)

没有协议

传输层

端口寻址、分段重组、流量、差错控制

TCP,UDP

网络层

逻辑寻址、路由选择

IP,ICMP,OSPF,EIGRP,IGMP

数据链路层

成帧、物理寻址、流量,差错,接入控制

SLIP,CSLIP,PPP,MTU

物理层

设置网络拓扑结构、比特传输、位同步

ISO2110,IEEE802,IEEE802.2

 

 

 

 

 

 

 

 网络 - 总结

TCP协议三次握手和四次挥手

 

 

 

为什么要三次和四次?

“三次握手”即对每次发送的数据量是怎样跟踪进行协商使数据段的发送和接收同步,根据所接收到的数据量而确定的数据确认数及数据发送、接收完毕后何时撤消联系,并建立虚连接。为了提供可靠的传送,TCP在发送新的数据之前,以特定的顺序将数据包的序号,并需要这些包传送给目标机之后的确认消息。TCP总是用来发送大批量的数据。当应用程序在收到数据后要做出确认时也要用到TCP。

 

TCP协议提供可靠的连接服务,采用三次握手建立一个连接。

 

第一次握手:建立连接时三次握手

,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

 

未连接队列

在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于 Syn_RECV状态。

当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。

 

Backlog参数表示未连接队列的最大容纳数目。SYN-ACK重传次数

服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。

 

半连接存活时间

是指半连接队列的条目存活的最长时间,也即服务器从收到SYN包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时我们也称半连接存活时间为Timeout时间、SYN_RECV存活时间。

 

四次挥手

 

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。

这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。

首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

 

(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。

(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,FIN将占用一个序号。

(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A。

(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1

 

为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?

    这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。

    但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

 

 

IP地址分类

私有地址(Private address)属于非注册地址,专门为组织机构内部使用。

私有IP地址在局部网络典型地使用包括家、学校和事务LANs包括机场和旅馆。

与私有IP地址的设备不可能连接直接地到互联网。 同样,在局部网络之外的计算机不可能连接直接地到设备用私有IP。

反而,必须由支持网络地址转换法路由器或相似的设备中介对这样设备的通入(NAT)

NAT掩藏私有IP数字,但是可能选择性地转移消息到这些设备,能安全层数局部网络。

 

私有IP就是在本地局域网上的IP 与之对应的是公有IP(在互联网上的IP)

随着私有IP网络的发展,为节省可分配的注册IP地址,有一组IP地址被拿出来专门用于私有IP网络,称为私有IP地址。

私有IP地址范围:

A: 10.0.0.0~10.255.255.255   10.0.0.0/8

B:172.16.0.0~172.31.255.255   即172.16.0.0/12

C:192.168.0.0~192.168.255.255   192.168.0.0/16

这些地址是不会被Internet分配的,它们在Internet上也不会被路由,虽然它们不能直接和Internet网连接,但通过技术手段仍旧可以和 Internet通讯(NAT技术)。

我们可以根据需要来选择适当的地址类,在内部局域网中将这些地址像公用IP地址一样地使用。在Internet上,有些不需要与 Internet通讯的设备,如打印机、可管理集线器等也可以使用这些地址,以节省IP地址资源。

 

 

课本讲得比较详细和系统。

IP地址分类

1.A类IP地址

一个A类IP地址由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是“0”, 地址范围1.0.0.1-126.255.255.254(二进制表示为:00000001 00000000 00000000 00000001 - 01111110 11111111 11111111 11111110)。可用的A类网络有126个,每个网络能容纳1677214个主机。

2.B类IP地址

一个B类IP地址由2个字节的网络地址和2个字节的主机地址组成,网络地址的最高位必须是“10”,地址范围128.1.0.1-191.255.255.254(二进制表示为:10000000 00000001 00000000 00000001 - 10111111 11111111 11111111 11111110)。可用的B类网络有16384个,每个网络能容纳65534主机 。

3.C类IP地址

一个C类IP地址由3字节的网络地址和1字节的主机地址组成,网络地址的最高位必须是“110”。范围192.0.1.1-223.255.255.254(二进制表示为: 11000000 00000000 00000001 00000001 - 11011111 11111111 11111110 11111110)。C类网络可达2097152个,每个网络能容纳254个主机。

4.D类地址用于多点广播(Multicast)。

D类IP地址第一个字节以“1110”开始,它是一个专门保留的地址。它并不指向特定的网络,目前这一类地址被用在多点广播(Multicast)中。多点广播地址用来一次寻址一组计算机,它标识共享同一协议的一组计算机。

地址范围224.0.0.1-239.255.255.254

5.E类IP地址

以“1111”开始,为将来使用保留。

E类地址保留,仅作实验和开发用。

全零(“0.0.0.0”)地址指任意网络。全“1”的IP地址(“255.255.255.255”)是当前子网的广播地址。

 

 

子网掩码

子网掩码(subnet mask)是每个使用互联网的人必须要掌握的基础知识,只有掌握它,才能够真正理解TCP/IP协议的设置。

子网掩码——屏蔽一个IP地址的网络部分的“全1”比特模式。对于A类地址来说,默认的子网掩码是255.0.0.0;对于B类地址来说默认的子网掩码是255. 255.0.0;对于C类地址来说默认的子网掩码是255.255.255.0。利用子网掩码可以把大的网络划分成子网即VLSM(可变长子网掩码),也可以把小的网络归并成大的网络即超网。

IP地址的网络号主机号各是多少位呢?如果不指定,就不知道哪些位是网络号、哪些是主机号,这就需要通过子网掩码来实现。

左边是网络位,用二进制数字“1”表示,1的数目等于网络位的长度;

右边是主机位,用二进制数字“0”表示,0的数目等于主机位的长度。

这样做的目的是为了让掩码与ip地址做AND运算时用0遮住原主机数,而不改变原网络段数字,而且很容易通过0的位数确定子网的主机数(2的主机位数次方-2,因为主机号全为1时表示该网络广播地址,全为0时表示该网络的网络号,这是两个特殊地址)。只有通过子网掩码,才能表明一台主机所在的子网与其他子网的关系,使网络正常工作。

主要作用有两个

一是用于屏蔽IP地址的一部分以区别网络标识主机标识,并说明该IP地址是在局域网上,还是在远程网上。

二是用于将一个大的IP网络划分为若干小的子网络。

 

使用子网是为了减少IP的浪费。因为随着互联网的发展,越来越多的网络产生,有的网络多则几百台,有的只有区区几台,这样就浪费了很多IP地址,所以要划分子网。使用子网可以提高网络应用的效率。

通过IP 地址的二进制与子网掩码的二进制进行与运算,确定某个设备的网络地址主机号,也就是说通过子网掩码分辨一个网络的网络部分和主机部分。子网掩码一旦设置,网络地址主机地址就固定了。子网一个最显著的特征就是具有子网掩码。与IP地址相同,子网掩码的长度也是32位,也可以使用十进制的形式。例如,为二进制形式的子网掩码:1111 1111.1111 1111.1111 1111.0000 0000,采用十进制的形式为:255.255.255.0。

通过计算机的子网掩码判断两台计算机是否属于同一网段的方法是,将计算机十进制的IP地址和子网掩码转换为二进制的形式,然后进行二进制“与”(AND)计算(全1则得1,不全1则得0),如果得出的结果是相同的,那么这两台计算机就属于同一网段。

 

 

欲将B类IP地址168.195.0.0划分成27个子网:

1)27=11011

2)该二进制为五位数,N = 5

3)将B类地址的子网掩码255.255.0.0的主机地址前5位置1(B类地址的主机位包括后两个字节,所以这里要把第三个字节的前5位置1),得到 255.255.248.0

即为划分成27个子网的B类IP地址 168.195.0.0的子网掩码(实际上是划成了32-2=30个子网)。

 

欲将B类IP地址168.195.0.0划分成若干子网,每个子网内有主机700台:

1) 700=1010111100

2)该二进制为十位数,N = 10

3)将该B类地址的子网掩码255.255.0.0的主机地址全部置1,得到255.255.255.255

然后再从后向前将后10位置0,即为: 11111111.11111111.11111100.00000000

即255.255.252.0。这就是该欲划分成主机为700台的B类IP地址168.195.0.0的子网掩码。

 

选择题 - 计算机网络

某网络的IP地址空间为192.168.5.0/24.采用定长子网划分,子网掩码为255.255.255.248,则该网络的最大子网个数,每个子网内的最大可分配地址个数为?

32,6

每个子网内除去一个广播地址和一个网络地址就只有六个可用于主机地址。

 

已知:IP地址是126.150.28.57 子网掩码为255.240.0.0  网络地址为126.140.0.0求子网内 可用IP地址是多少?

255.240.0.0     =11111111.11110000.00000000.00000000 子网掩码(与)
126.150.28.57 =01111110.10010110.00011100.00111001网络地址:01111110.10010000.00000000.00000000=126.144.0.0广播地址:01111110.10011111.11111111.11111111=126.159.255.255
子网内第一个可用IP地址:126.144.0.1
子网内最后一个可用IP地址:126.159.255.254

子网掩码:是一种用来指明一个IP地址的哪些位标识的是主机所在的子网以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成网络地址主机地址两部分。

 


阿里巴巴有相距1500km的机房A和B,现有100GB数据需要通过一条FTP连接在100s的时间内从A传输到B。已知FTP连接建立在TCP协议之上,而TCP协议通过ACK来确认每个数据包是否正确传送。网络信号传输速度2*108m/s,假设机房间带宽足够高,那么A节点的发送缓冲区可以设置为最小(A)

    A、18M          B、12M         C、6M         D、24M

    分析:

    TCP协议原理:TCP每发送一个报文段,就启动一个定时器,如果在定时器超时之后还没有收到ACK确认,就重传该报文。

    如图所示,数据包由A的缓冲区发往B,B在收到数据包以后,回发一个ACK确认包给A,之后A将该数据包从缓冲区释放。因此,该数据包会一直缓存在A的缓冲区,直到一个ACK确认为止。题目要求在100s内发送100GB数据,网络的传输速率至少是1G/s,某个数据包n在A中缓存的时间就是数据包n从A到B,再加上该数据包的ACK从B到A的时间:2*1500km/(2*108m/s)=1.5*10-2s,该段时间A中缓存的数据量至少是1G/s*1.5*10-2s约为15M





现有一完全的P2P共享协议,每次两个节点通讯后都能获取对方已经获取的全部信息,现在使得系统中每个节点都知道所有节点的文件信息,共17个节点,假设只能通过多次两个对等节点之间通讯的方式,则最少需要(C)次通讯

    A、32       B、31       C、30        D、29



     分析:如上图1所示,假设有5个节点,按连线1、2、3、4通讯之后,节点4和5就掌握了所有节点的信息,之后,1、2、3节点只需跟4或5任一节点通讯一次即连线5、6、7就可保证每个节点都知道所有节点的信息,总的通讯次数是(n-1)+(n-2)=2n-3次。

如果将所有节点分成两组,如图2所示,两组中的节点分别按连线1-8顺序通讯之后,节点4和5就掌握了1-5所有节点的信息,节点9和0就掌握了6-0所有节点的信息,再按连线9、10通讯之后,节点4、5、9、0就掌握了1-0所有节点的信息,剩下的节点只需跟4、5、9、0任一节点通讯一次就可保证每个节点知道所有节点信息,和图1相比,多了9和10两次通讯,总的通讯次数是(2n1-3)+(2n2-3)+2=2n-4次(n1和n2分别表示分组中元素个数)。

分3组的情况是(2n1-3)+(2n2-3)+(2n3-3)+6=2n-3次

分4组的情况是(2n1-3)+(2n2-3)+(2n3-3)+(2n4-3)+8=2n-4次









 

 

Http状态码

· 200 - 服务器成功返回网页

· 404 - 请求的网页不存在

· 503 - 服务器超时

 

1xx 状态码

表示临时响应并需要请求者继续执行操作的状态码。

100(继续)

请求者应当继续提出请求。服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。

101(切换协议)

请求者已要求服务器切换协议,服务器已确认并准备切换协议。

2xx 状态码

表示成功处理了请求的状态码。

200(成功)

服务器已成功处理了请求。通常,这表示服务器提供了请求的网页。如果针对您的 robots.txt 文件显示此状态码,则表示 Googlebot 已成功检索到该文件。

201(已创建)

请求成功并且服务器创建了新的资源。

202(已接受)

服务器已接受请求,但尚未处理。

203(非授权信息)

服务器已成功处理了请求,但返回的信息可能来自另一来源。

204(无内容)

服务器成功处理了请求,但没有返回任何内容。

205(重置内容)

服务器成功处理了请求,但没有返回任何内容。与 204 响应不同,此响应要求请求者重置文档视图(例如,清除表单内容以输入新内容)。

206(部分内容)

服务器成功处理了部分 GET 请求。

3xx 状态码

要完成请求,需要进一步操作。通常,这些状态码用来重定向。建议您在每次请求中使用重定向不要超过 5 次。您可以使用网站管理员工具查看一下 Googlebot 在抓取重定向网页时是否遇到问题。诊断下的网络抓取页列出了由于重定向错误导致 Googlebot 无法抓取的网址。

300(多种选择)

针对请求,服务器可执行多种操作。服务器可根据请求者 (user-agent) 选择一项操作,或提供操作列表供请求者选择。

301(永久移动)

请求的网页已永久移动到新位置。服务器返回此响应(对 GET或 HEAD 请求的响应)时,会自动将请求者转到新位置。您应使用此代码告诉 Googlebot 某个网页或网站已永久移动到新位置。

302(临时移动)

服务器目前从不同位置的网页响应请求,但申请人应当继续使用原有位置来响应以后的请求。此代码与响应 GET 和 HEAD 请求的 301 代码类似,会自动将请求者转到不同的位置,但不应使用此代码来告诉 Googlebot 页面或网站已经移动,因为 Googlebot 要继续抓取原来的位置并编制索引。

303(查看其他位置)

请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。对于除 HEAD 之外的所有请求,服务器会自动转到其他位置。

304(未修改)

自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。

如果网页自请求者上次请求后再也没有更改过,您应当将服务器配置为返回此响应(称为 If-Modified-Since HTTP 标头)。由于服务器可以告诉 Googlebot 自从上次抓取后网页没有变更,因此可节省带宽和开销。

305(使用代理)

请求者只能使用代理访问请求的网页。如果服务器返回此响应,还表示请求者应当使用代理。

307(临时重定向)

服务器目前从不同位置的网页响应请求,但请求者应当继续使用原有位置来响应以后的请求。此代码与响应 GET 和 HEAD 请求的 <a href=answer.py?answer=>301</a> 代码类似,会自动将请求者转到不同的位置,但您不应使用此代码来告诉 Googlebot 某个网页或网站已经移动,因为 Googlebot 会继续抓取原有位置并编制索引。

4xx 状态码

这些状态码表示请求可能出错,这妨碍了服务器的处理。

400(错误请求)

服务器不理解请求的语法。

401(身份验证错误)

此页要求授权。您可能不希望将此网页纳入索引。如果您的 Sitemap 中列出该网页,您可以将其删除。但如果您将其保留在您的 Sitemap 中,我们就不会抓取或索引该网页(尽管该网页将继续保持错误状态在此处列出)。如果我们将其作为搜索抓取的一部分抓取,您可以在我们的网站管理员信息中查阅其原因。

403(禁止)

服务器拒绝请求。如果您在Googlebot 尝试抓取您网站上的有效网页时看到此状态码(可以在 Google 网站管理员工具<strong>诊断</strong>下的<strong>网络抓取< /strong>页面上看到此信息),可能是您的服务器或主机拒绝 Googlebot 访问。

404(未找到)

服务器找不到请求的网页。例如,对于服务器上不存在的网页经常会返回此代码。

如果您的网站上没有 robots.txt 文件,而您在 Google网站管理员工具"诊断"标签的 robots.txt 页上看到此状态码,那么这是正确的状态码。但是,如果您有 robots.txt文件而又看到此状态码,则说明您的 robots.txt文件可能命名错误或位于错误的位置(该文件应当位于顶级域,名为 robots.txt)。

如果对于 Googlebot 尝试抓取的网址看到此状态码(在"诊断"标签的 HTTP 错误页面上),则表示 Googlebot 追踪的可能是另一个页面的无效链接(是旧链接或输入有误的链接)。

405(方法禁用)

禁用请求中指定的方法。

406(不接受)

无法使用请求的内容特性响应请求的网页。

407(需要代理授权)

此状态码与 401 类似,但指定请求者必须授权使用代理。如果服务器返回此响应,还表示请求者应当使用代理。

408(请求超时)

服务器等候请求时发生超时。

409(冲突)

服务器在完成请求时发生冲突。服务器必须在响应中包含有关冲突的信息。服务器在响应与前一个请求相冲突的 PUT 请求时可能会返回此代码,以及两个请求的差异列表。

410(已删除)

请求的资源永久删除后,服务器返回此响应。该代码与404(未找到)代码相似,但在资源以前存在而现在不存在的情况下,有时会用来替代 404代码。如果资源已永久删除,您应当使用 301 指定资源的新位置。

411(需要有效长度)

服务器不接受不含有效内容长度标头字段的请求。

412(未满足前提条件)

服务器未满足请求者在请求中设置的其中一个前提条件。

413(请求实体过大)

服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。

414(请求的 URI 过长)

请求的 URI(通常为网址)过长,服务器无法处理。

415(不支持的媒体类型)

请求的格式不受请求页面的支持。

416(请求范围不符合要求)

如果页面无法提供请求的范围,则服务器会返回此状态码。

417(未满足期望值)

服务器未满足"期望"请求标头字段的要求。

5xx 状态码

这些状态码表示服务器在处理请求时发生内部错误。这些错误可能是服务器本身的错误,而不是请求出错。

500(服务器内部错误)

服务器遇到错误,无法完成请求。

501(尚未实施)

服务器不具备完成请求的功能。例如,服务器无法识别请求方法时则会返回此代码。

502(错误网关)

服务器作为网关或代理,从上游服务器收到无效响应。

503(服务不可用)

服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。

504(网关超时)

服务器作为网关或代理,但是没有及时从上游服务器收到请求。

505(HTTP 版本不受支持)

服务器不支持请求中所用的HTTP 协议版本。

 

最近看一些公司的面试题,看见他们对HTTP 状态码这个问题都情有独钟,我细细一琢磨,猛然问我这么个问题,我也回答不出几个,于是也忍不住搜索一番,这才发现,原来这HTTP状态码也内有乾坤,数量很多,要我死记硬背,一来让你故意忘记,二来也没什么大用,于是我决定在对HTTP 状态码进行一番整理,从而可以便于查找和复习,而且,写一遍后,记得更加牢固了。

  首先,HTTP 状态码是用以表示网页服务器HTTP响应状态的3位数字代码。而第一个数字代表响应的五种状态之一: 1代表消息  2代表成功  3代表重定向 4代表请求错误 5代表服务器错误。   

其次作为程序员,我找出几个典型的HTTP 状态码,在1开头状态码里面的没有经常使用的,忽略不计。

 以2开头的状态码中有几个常用的:   200 OK   请求已成功,请求所希望的响应头或数据体将随此响应返回。   206 Partial Content   服务器已经成功处理了部分 GET 请求。类似于 FlashGet 或者迅雷这类的 HTTP 下载工具都是使用此类响应实现断点续传或者将一个大文档分解为多个下载段同时下载。   

 以3开头的状态码常见的:    301 Moved Permanently 重定向专用状态码    302 Found    304 Not Modified  研究过浏览器缓存,就该知道这个状态码的重要性。  

 以4开头的状态码常见的:    404 Not Found 如果连这个都不知道,就别混了。    400 Bad Request    403 Forbidden   

以5开头的状态码常见的:    500 Internal Server Error    501 Not Implemented    502 Bad Gateway    503 Service Unavailable    最后附上详细的HTTP状态码网址:有兴趣可以去以下的网址查询:http://baike.baidu.com/view/1790469.htm    附:PHP对发送HTTP状态码的支持很差,也许是觉得不常用?如果要发送其他的(非200)的状态码,就必须使用header函数。    如:

Php代码  

1 header("HTTP/1.1 404 Not Found");  

这个不如jsp方便。

 

 

 

 

 

posted @ 2015-09-26 22:28  Uncle_Nucky  阅读(248)  评论(0)    收藏  举报