您的位置:首页 > 理论基础 > 计算机网络

程序员常见面试之 计算机网络 知识点小结

2016-01-18 13:44 603 查看

总结

笔者悉心整理校正了计算机网络的面试常用知识点,不同于网上的copy来copy去,文章图文并茂,通俗易懂,希望对大家有所帮助。

文章链接 http://blog.csdn.net/never_cxb/article/details/50420521 ,分享请保留出处。

TCP 七层模型

OSI 七层网络模型
Linux TCP/IP 四层概念模型
对应网络协议
应用层 Application
应用层

FTP(文件传输协议) HTTP(超文本传输协议) DNS(域名服务器协议) SMTP(简单邮件传输协议) NFS(网络文件系统协议)
表示层 Presentation
会话层 Session
传输层 Transport
传输层
TCP, UDP
网络层 Network
网际层
IP, ICMP, ARP, RARP, AKP, UUCP
数据链路层 Data Link
网络接口
FDDI, Ethernet, Arpanet, PDN, SLIP, PPP
物理层 Physical
IEEE 802.1A, IEEE 802.2 到 IEEE 802.11
Server A 和 Server B 直接传输数据,有封装和解封装的过程。数据从A 的应用层发下来,会在每一层都会加上头部信息,进行封装,然后再发送到B。然后 B 从最下面的物理层每一层进行解封装,最后到达应用层,得到数据。

在OSI七层模型中,每一层的作用和对应的协议如下:

  【1】物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0,也就是我们常说的数模转换与模数转换),这一层的数据叫做比特。

  

  【2】数据链路层:定义了如何让格式化数据以进行传输,以及如何让控制对物理介质的访问,这一层通常还提供错误检测和纠正,以确保数据的可靠传输。

  

  【3】网络层:IP 协议,在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择,Internet的发展使得从世界各站点访问信息的用户数大大增加,而网络层正是管理这种连接的层。

  

  【4】传输层:TCP,UDP 协议,定义了一些传输数据的协议和端口号(WWW端口80等),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的), 主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组,常常把这一层数据叫做段。

  

  【5】会话层:通过传输层(端口号:传输端口与接收端口)建立数据传输的通路,主要在你的系统之间发起会话或者接受会话请求(设备之间需要互相认识可以是IP也可以是MAC或者是主机名)。

  

  【6】表示层:可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。例如,PC程序与另一台计算机进行通信,其中一台计算机使用扩展二一十进制交换码(EBCDIC),而另一台则使用美国信息交换标准码(ASCII)来表示相同的字符。如有必要,表示层会通过使用一种通格式来实现多种数据格式之间的转换。

  

  【7】应用层: 是最靠近用户的OSI层,这一层为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络服务。

TCP

源端口号和目的端口号配合上IP首部中的源IP地址和目的IP地址就能唯一的确定一个TCP连接

IP 地址

A 类 B 类 C 类

IP的地址字段范围是0~127,但是由于全0和全1的地址用作特殊用途,实际可指派的第一个字段范围是1~126。

A类地址范围:0.0.0.1——126.255.255.254,默认网络掩码为 255.0.0.0

B类地址范围:128.0.0.1——191.255.255.254,默认子网掩码为255.255.0.0

C类地址范围:192.0.0.1——223.255.255.254,默认子网掩码为255.255.255.0

注意上面 0 到 128相差128,128到192相差64,后面192到224相差32。这是因为A->B->C类地址,各个地址开头分别为 0 -> 10 -> 110 等等。

特殊的地址

A 类中 127.0.0.0到127.255.255.255是保留地址,用做循环测试用的。

环回的特征是数据包不经过IP层以下的协议栈,直接被拷贝到环回地址socket的缓冲区中。一般采用127.0.0.1,即 localhost。

B类中169.254.0.0到169.254.255.255是保留地址。如果你的IP地址是自动获取IP地址,而你在网络上又没有找到可用的DHCP服务器,这时你将会从169.254.0.0到169.254.255.255中临得获得一个IP地址。

我们知道 ip 地址=

网络地址 + 主机地址。主机地址全为0和全为1的一般不用。

(1)主机地址全为“0”。不论哪一类网络,主机地址全为“0”表示指向本网,常用在路由表中。

(2)主机地址全为“1”。主机地址全为“1”表示广播地址,向特定的所在网上的所有主机发送数据包。这儿的只是主机地址为1的也叫直接广播地址。

(3)四字节32比特全为“1”。若IP地址4字节32比特全为“1”,表示仅在本网内进行广播发送。255.255.255.255,32位全为1也叫首先广播地址,只能作为目的地址。

(4)四字节32比特全为“0”,0.0.0.0,表示本网络本主机地址,只能作为源地址。无盘工作站启动时候没有源地址,此时采用0.0.0.0本网络本主机地址作为源地址。

私有地址

私有地址包括3组

A类:10.0.0.0~10.255.255.255

B类:172.16.0.0~172.31.255.255

C类:192.168.0.0~192.168.255.255

学校里的局域网,因为大概有几十万人,所以是10开头的局域网。而我们买的无线路由器,也要设置局域网,一般为192开头的,比如192.168.0.1或者192.168.199.1(我的极路由就是这个地址)

我们建企业网(单位网络)时,一般是使用私有地址来分配内部主机,小企业使用C类的192.168.0.0网络,中型企业使用172.16.0.0(私有部分)网络,如果还不够用,还有10.0.0.0网络。

Class前缀位网络地址位数剩余的位数网络数每个网络的主机数
A类地址082412816,777,214
B类地址10161616,38465,534
C类地址1102482,097,152254
D类地址(群播)1110未定义未定义未定义未定义
E类地址(保留)1111未定义未定义未定义未定义

子网划分

以C类网络为例,原有8位主机位,2的8次方即256个主机地址,默认子网掩码255.255.255.0。借用1位主机位,产生2个子网,每个子网有126个主机地址;借用2位主机位,产生4个子网,每个子网有62个主机地址……

第一个IP地址(即主机部分全部为0的IP)和最后一个IP(即主机部分全部为1的IP)不能分配给主机使用

练习题

把子网掩码为255.255.0.0的网络40.15.0.0分为两个子网,假设第一个子网为40.15.0.0/17,则第二个子网为?

答案是划分为两个子网的话子网掩码应该为255.255.128.0

第一个子网是40.15.0.0/17,可用地址范围是40.15.0.1~40.15.127.254

第二个子网是40.15.128.0/17,可用地址范围是40.15.128.1~40.15.255.254

解析:掩码的前两个八位是255,第三个8位是128,有2的一次方个子网(因j为第三个8为只有一个1,后面7位都是0),所以ip 地址第三个8位是0000,0000或者1000,0000,即0或者128。因为第3个8位是1000,0000,可以区分开头第一个数是0还是1, 区分了两个子网。所以这两个子网是40.15.0.0和40.15.128.0

关于0子网和1子网

一个B类地址, 172.16.0.0。 默认B类地址172.16.0.0具有16位保留用于主机部分表示,因此支持65534(216-2)有效主机地址。 如果网络172.16.0.0/16被从主机部分借用的三比特划分子网,可以获得八个(23)子网。 下表是一个示例,显示了通过划分子网172.16.0.0获得的子网、产生的子网掩码、对应的广播地址、有效主机地址的范围。

子网地址

子网掩码

广播地址

有效主机范围

172.16.0.0

255.255.224.0

172.16.31.255

172.16.0.1对172.16.31.254

172.16.32.0

255.255.224.0

172.16.63.255

172.16.32.1对172.16.63.254

172.16.64.0

255.255.224.0

172.16.95.255

172.16.64.1对172.16.95.254

172.16.96.0

255.255.224.0

172.16.127.255

172.16.96.1对172.16.127.254

172.16.128.0

255.255.224.0

172.16.159.255

172.16.128.1对172.16.159.254

172.16.160.0

255.255.224.0

172.16.191.255

172.16.160.1对172.16.191.254

172.16.192.0

255.255.224.0

172.16.223.255

172.16.192.1对172.16.223.254

172.16.224.0

255.255.224.0

172.16.255.255

172.16.224.1对172.16.255.254

NAT穿透技术

NAT(Network Address Translation,网络地址转换)是一种网络地址翻译技术,将内部私有IP地址改变成可以在公网上使用的.



NAT三种实现方式

静态地址转换:一个公网IP对应一个内部IP,一对一转换

动态地址转换:N个公网IP对应M个内部Ip,不固定的一对一IP转换关系.同一时间,有M-N个主机无法联网.

端口多路复用:对外只有一个公网IP,通过端口来区别不同内部IP主机的数据.

例子

有一个私有网络10...*,Client A是其中的一台计算机,这个网络的网关(一个NAT设备)的外网IP是155.99.25.11(应该还有一个内网的IP地址,比如10.0.0.10)。如果Client A中的某个进程(这个进程创建了一个UDP Socket,这个Socket绑定1234端口)想访问外网主机18.181.0.31的1235端口,那么当数据包通过NAT时会发生什么事情呢?

首先NAT会改变这个数据包的原IP地址,改为155.99.25.11。接着NAT会为这个传输创建一个Session(Session是一个抽象的概念,如果是TCP,也许Session是由一个SYN包开始,以一个FIN包结束。而UDP呢,以这个IP的这个端口的第一个UDP开始,结束呢,呵呵,也许是几分钟,也许是几小时,这要看具体的实现了)并且给这个Session分配一个端口,比如62000,然后改变这个数据包的源端口为62000。所以本来是(10.0.0.1:1234->18.181.0.31:1235)的数据包到了互联网上变为了(155.99.25.11:62000->18.181.0.31:1235)。

一旦NAT创建了一个Session后,NAT会记住62000端口对应的是10.0.0.1的1234端口,以后从18.181.0.31发送到62000端口的数据会被NAT自动的转发到10.0.0.1上。(注意:这里是说18.181.0.31发送到62000端口的数据会被转发,其他的IP发送到这个端口的数据将被NAT抛弃)这样Client A就与Server S1建立以了一个连接。

网关

如果网络A中的主机发现数据包的目的主机不在本地网络中,就把数据包转发给它自己的网关,再由网关转发给网络B的网关,网络B的网关再转发给网络B的某个主机。

三次握手

一些名词

seq (Sequence Number)序列号,这是为了连接以后传送数据用的
ack(Acknowledgment Number)确认序列号,是对收到的数据包的确认,值是等待接收的数据包的序列号。
SYN synchronous 同步信号
ACK Acknowledgement 应答信号, 当 ACK=1时候表示ack字段有意义
SYN 和 ACK 也表示 TCP 的标志位?

三次握手的步骤



1. 主机 A 发起握手,目的端点是主机 B 的端点 2

- 生成一个随机数作为它的初始化发送序号 x

- 发出一个同步报文段,SYN=1,发送序号 seq=x,ACK=0

2. 主机 B 监听到端口2上有连接请求,主机 B 响应,并继续同步过程

- 生成一个随机数作为它的初始发送序号 seq = y

- 发出同步报文字段并对主机 A 端口1的连接请求进行确认,SYN=1,发出的序号 seq=y,ACK=1,确认序号 ack=x+1

3. 主机 A

-发出对 B 端口2的确认,seq=x+1,ACK=1,确认序号 ack=y+1

在第一次消息发送中,A随机选取一个序列号作为自己的初始序号发送给B;

第二次消息B使用ack对A的数据包进行确认,因为已经收到了序列号为x的数据包,准备接收序列号为x+1的包,所以ack=x+1,同时B告诉A自己的初始序列号,就是seq=y;

第三条消息A告诉B收到了B的确认消息并准备建立连接,A自己此条消息的序列号是x+1,所以seq=x+1,而ack=y+1是表示A正准备接收B序列号为y+1的数据包。

对 x 加1 以及 y 加 1都是一种确认收到消息的机制,发出信号和返回信号一比较是否差1就能确认是否正确。

seq是数据包本身的序列号;ack是期望对方继续发送的那个数据包的序列号。

为什么采用3次握手而不是2次握手?

如果两次握手的话,客户端有可能因为网络阻塞等原因会发送多个请求报文,这时服务器就会建立连接,浪费掉许多服务器的资源

第3次失败会怎么办?

第三次失败,只有客户端处于成功状态(因为第2次服务器返回了确认请求),服务器端没有接收到客户端的第3次确认。所以后面会有其他机制来处理这种情况。

笔试题中经常会遇到这个问题:如果tcp建立连接时第三次握手失败,tcp会做何操作?

在此,将《TCP/IP协议族》中每一个状态的转换伪代码整理下:

第58行指明了当第三次握手失败时的处理操作,可以看出当失败时服务器并不会重传ack报文,而是直接发送RTS报文段,进入CLOSED状态。这样做的目的是为了防止SYN洪泛攻击。

四次握手关闭连接



主机 A 关闭 A主机的 端口1 到 B主机的 端口2的传输连接:

应用程序通知 TCP 数据已经发送完毕时,关闭连接
TCP 向主机 B 发送一个带 FIN 附加标记的报文段(FIN 表示 finish),FIN=1,seq=x,x 为 A 发送数据的最后字节的序号加1,虽然是关闭连接,报文段的交换中也要使用序号

主机 B 响应:

收到这个 FIN 报文段之后,并不立刻用 FIN 报文段回复主机 A,而是先向主机 A 发送一个确认序号 ,ACK=1,ack=x+1
同时通知自己相应的应用程序,主机 A 方传输已经结束,对方要求关闭连接(先发送 ACK 的目的是为了防止这段时间内,主机 A 重传 FIN 报文段)

此时 A 到 B 方向上的传输连接已经关闭(看第4有TIME_WAIT状态等待2MSL,第2步的 A 到 B 并没有彻底关闭?),但是主机 B 到 A 还可以发送数据,连接处于半关闭的状态。(因为原来 TCP 是全双工的工作方式,只关闭了一端的连接)

主机 B 关闭 端口2到端口1的传输连接:
应用程序告诉 TCP: 我要彻底地关闭连接
TCP 收到对最后数据的确认后,向主机 A 发送一个 FIN 报文段。FIN=1,seq=y,y 是 B 发送数据的最后字节的序号加1。ACK=1,seq=x+1。

主机 A 响应:
收到这个 FIN 报文段之后,向主机 B 发送一个 ACK 表示连接彻底释放。ACK=1,ack=y+1
主机B收到主机A的ACK报文段以后,就关闭连接;此时,主机A等待2MSL (Maximum Segment Lifetime)后依然没有收到回复,则证明主机 B已正常关闭,那好,主机A也可以关闭连接了。

为什么连接的时候是三次握手,关闭的时候却是四次握手?

TCP是全双工模式,关闭连接时,当 主机 B收到主机A的FIN报文时,仅仅表示主机 A不再发送数据了但是还能接收数据。

主机 B也未必全部数据都发送给A了,所以B可以立即close;也可以发送一些数据给A后,再发送FIN报文给对方来表示同意现在关闭连接,因此, 主机 BACK和FIN一般都会分开发送。

IP 地址后面加斜杠

例如:192.168.1.0/24 表示网段是192.168.1.0,子网掩码是24位。

子网掩码为:255.255.255.0,用二进制表示为:11111111 11111111 11111111 00000000 ,斜杠后面的24表示子网掩码前24位为1.

TCP/IP 端口区分不同的应用进程

比如,在TCP和UDP同属于传输层,共同架设在IP层(网络层)之上。而IP层主要负责的是在节点之间(End to End)的数据包传送,这里的节点是一台网络设备,比如计算机。因为IP层只负责把数据送到节点,而不能区分上面的不同应用,所以TCP和UDP协议在其基础上加入了端口的信息,端口于是标识的是一个节点上的一个应用。除了增加端口信息,UPD协议基本就没有对IP层的数据进行任何的处理了。而TCP协议还加入了更加复杂的传输控制,比如滑动的数据发送窗口(Slice Window),以及接收确认和重发机制,以达到数据的可靠传送。不管应用层看到的是怎样一个稳定的TCP数据流,下面传送的都是一个个的IP数据包,需要由TCP协议来进行数据重组。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 网络协议