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

前言

悉心整理校正了计算机网络的面试常用知识点,图文并茂,通俗易懂,希望对大家有所帮助。

文章链接 http://www.alijava.com/network-interview/ ,分享请保留出处。

TCP/IP 参考模型

分层

每一层都是独立存在的,因此分配到各层的任务能够独立地执行,变更其中某层提供的方案时不影响其他层。

这也可以理解为一个松耦合的设计。

tcpip 模型

详解

网络层 主要是 ip 协议,可以通过 ip 找到某个机器,但是机器上有很多应用程序,每个程序都占用相应的端口,传输层 不同协议有不同的端口,通过 ip + 端口 就可以确定某个机器上的具体应用程序了。

Server A 和 Server B 直接传输数据,有封装和解封装的过程。

数据从A 的应用层往下走到物理层,会在每一层都会加上头部信息,进行封装,然后再发送到B。

然后 Server B 从 最下面的物理层往上 每一层进行解封装,最后到达应用层,得到数据。

  • 物理层:将电脑连起来,可以用光缆、电缆、双绞线、无线电波等方式

  • 链路层:数据包会带上发送地址和接收地址,也就是MAC地址

  • 网络层:网络地址帮助我们确定计算机所在的子网络,MAC地址则将数据包送到该子网络中的目标网卡。
    因此,从逻辑上可以推断,必定是先处理网络地址,然后再处理MAC地址。

  • 传输层:同一台主机上有许多程序都需要用到网络,端口可以确定表示这个数据包到底供哪个程序使用。
    传输层建立”端口到端口”的通信,”网络层”的功能是建立”主机到主机”的通信。
    (ftp 21,ssh 22,dns 53,http 80)

  • 应用层 我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如果没有应用层,便无法识别数据内容。
    如果想要使传输的数据有意义,则必须使用到应用层协议。

  

TCP 区别 UDP

TCP连接是由4个值来识别的: <源IP地址、源端口号、目的IP地址、目的端口号>

  • TCP是面向连接的、可靠的
    其实网络的不安全不稳定特性,无论多少次握手都不能保证连接的可靠性
    但TCP的三次握手在最低限度上(实际上也很大程度上保证了)保证了连接的可靠性
  • UDP 无连接的、不可靠
    UDP传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收,当然也不用重发,

 UDP 交给上层进行差错控制,可以代码对UDP的数据收发进行验证,比如发送方对每个数据包进行编号然后由接收方进行验证啊什么的

 即使是这样,UDP因为在底层协议的封装上没有采用类似TCP的“三次握手”而实现了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 类地址, 0 开头, 128 个
B 类地址,10 开头,16,384 个
C 类地址,110 开头,2,097,152 个

特殊的地址

ip 地址= 网络号 + 主机号

网络号 主机号 用途
全为0 全为0 表示本主机,用作源地址,启动时用,获取了 IP 地址后不再使用
全为0 host-id 本地网络上主机号为 host-id 的主机,只作为源地址
全为1 全为1 有限广播(本地网络),只作目的地址,各路由器都不转发
net-id 全为1 定向广播(net-id标识的网络),只作目的地址
net-id 全为0 标识一个网络
127 任意 本地软件回送地址

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

私有地址

私有地址包括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 网络。

子网划分

以C类网络为例,原有8位主机位,2的8次方即256个主机地址,默认子网掩码255.255.255.0。

借用1位主机位,产生2个子网,每个子网有126个主机地址;借用2位主机位,产生4个子网,每个子网有62个主机地址……

练习题

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

40.15.0.0/17 表示网段是40.15.0.0,子网掩码是17位。

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

答案:

划分为两个子网的话子网掩码应该为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,第三个八位是128,有2的一次方个子网(因为第三个八位只有一个1,后面七位都是0),所以ip 地址第三个8位是0000,0000或者1000,0000,即0或者128。

因为第3个8位是1000,0000,可以区分开头第一个数是0还是1, 区分了两个子网。所以这两个子网是40.15.0.0和40.15.128.0

NAT穿透技术

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

NAT

NAT三种实现方式

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

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

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

网关

  • 网关(gateway)能在不同协议间移动数据

  • 路由器(router)是在不同网络间移动数据
    相当于传统所说的IP网关(IP gateway)

三次握手

一些名词

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

三次握手的步骤

三次握手

  1. 客户端 发起握手,目的端点是 服务端 的端点 post_server
    • 生成一个随机数作为它的初始化发送序号 x
    • 发出一个同步报文段,SYN=1,发送序号 seq=x
    • 并进入SYN_SEND状态,等待服务器确认
  2. 服务端监听到端口 post_server 上有连接请求,响应
    • 生成一个随机数作为它的初始发送序号 seq = y
    • 发出同步报文字段并对主机 A 端口1的连接请求进行确认,发送ack=x+1
    • 即发送 SYN+ACK 包,此时服务器进入SYN_RECV状态
  3. 主机 A
    • 发出对 服务端 端口 post_server 的确认,确认序号 ack=y+1,还有seq=x+1
    • 客户端和服务器进入ESTABLISHED状态,完成三次握手

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

  • 第一次握手 客户端发,服务端 知道 客户端 可以 发消息
  • 第二次握手 服务端收和发,客户端 知道 服务端 可以 接收消息 和 发消息
  • 第三次握手 客户端收和发,服务端 知道 客户端可以 接收消息 和 发消息

3 次是双向通信的最小值,也就是 SYN, SYN ACK, ACK ,两个发送、两个接收 ,其中第二次把接收和发送合在一起了

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

第3次失败会怎么办?

第三次失败,只有客户端处于成功状态(因为第2次服务器返回了ACK),服务器端没有接收到客户端的 ACK。

这要分几种情况讨论:

  • In other words, if the ACK is dropped but the next packet is not dropped, then everything is fine.
    也就是说客户端发出的 ACK 丢失了,发出的 下一个数据包 没有丢失,则服务端接收到下一个数据包(这个数据包里也会带上 ACK 信息),能够进入正常的 ESTABLISHED 状态

  • 如果服务端和客户端都没有数据发送,或者服务端想发送数据(但是发不了,因为没有收到客户端的 ACK),服务器都会有定时器发送第二步SYN+ACK数据包,如果客户端再次发送ACK成功,建立连接。

    如果一直不成功,服务器肯定会有超时设置,超时之后会给客户端发RTS报文,进入CLOSED状态,防止SYN洪泛攻击。

四次握手关闭连接

四次握手

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

  • 应用程序通知 TCP 数据已经发送完毕时,关闭连接
  • TCP 向主机 B 发送一个带 FIN 附加标记的报文段(FIN 表示 finish),FIN=1,seq=x

(2)主机 B 响应:

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

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

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

(4)主机 A 响应:

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

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

TCP是全双工模式,关闭连接时,每个方向都必须单独进行关闭。

当 主机 B 收到主机 A 的FIN报文时,仅仅表示主机 A 不再发送数据了但是 A 还能接收数据。

如果主机 B 全部数据都已经发送给 A 了,B 可以立即close;也可以发送一些数据给 A 后,再发送 FIN 报文关闭连接。

因此, 主机 B 的 ACK 和 FIN 一般都会分开发送。

参考文章