计算机网络面试总结
计算机网络面试总结
TCP&UDP
TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。 一个TCP连接必须要经过三次“对话”才能建立起来。
- 主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;
- 主机B向主机A发送同意连接和要求同步 (同步就是两台主机一个在发送,一个在接收,协调工作)的数据包 :“可以,你什么时候发?”,这是第二次对话;
- 主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”, 这是第三次对话。
三次“对话”的目的是使数据包的发送和接收同步, 经过三次“对话”之后,主机A才向主机B正式发送数据。
三次握手
- 主机A通过向主机B发送一个含有同步序列号(SYN)的标志位的数据段,向B请求建立连接,通过这个数据段, A告诉B两件事:我想要和你通信;你可以用这个序列号作为起始数据段来回应我。
- B收到A的请求后,用一个带有确认应答(ACK)和同步序列号(SYN)标志位的数据段响应A,也告诉A两件事:我已收到请求了,你可以传输数据了;你要用这个序列号作为起始数据段来回应我。
- A收到这个数据段后,再发送一个确认应答(ACK),确认已收到B的数据段:已收到回复,现在要开始传输实际数据了,这样3次握手就完成了,主机A和主机B就可以传输数据了。
没有应用层的数据,SYN这个标志位只有在TCP建立连接时才会被置1,握手完成后SYN标志位被置0。
四次挥手
- 当A完成数据传输后,将控制位FIN置1,提出停止TCP连接的请求;
- B收到FIN后对其作出响应,确认这一方向上的TCP连接将关闭,将ACK置1;
- 由B端再提出反方向的关闭请求,将FIN置1;
- A对B的请求进行确认,将ACK置1,双方向的关闭结束。
由TCP的三次握手和四次断开可以看出,TCP使用面向连接的通信方式, 大大提高了数据通信的可靠性,使发送数据端和接收端在数据正式传输前就有了交互, 为数据正式传输打下了可靠的基础。
- ACK 是 TCP 报头的控制位之一,对数据进行确认。确认由目的端发出, 用它来告诉发送端这个序列号之前的数据段都收到了。只有当 ACK=1 时,确认号才有效,当ACK=0时,确认号无效,这时会要求重传数据,保证数据的完整性。
- SYN 同步序列号,TCP 建立连接时将这个位置 1。
- FIN 发送端完成发送任务位,当 TCP 完成数据传输需要断开时,提出断开连接的一方将这位置1。
UDP 与 TCP 对比
- TCP 面向连接,需要三次握手,四次挥手。UDP 是无连接的,即发送数据之前不需要建立连接,直接丢过去。
- TCP 提供可靠的服务,通过 TCP 连接传送的数据,无差错、不丢失、不重复,且按序到达。UDP 尽最大努力交付,即不保证可靠交付。
- TCP 面向字节流,实际上是 TCP 把数据看成一连串无结构的字节流。UDP 是面向报文的,UDP 没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如 IP 电话,实时视频会议等)。
- 每一条 TCP 连接只能是点到点的,UDP 支持一对一,一对多,多对一和多对多的交互通信。
- TCP 首部开销20字节,UDP 的首部开销小,只有8个字节。
- TCP 的逻辑通信信道是全双工的可靠信道,UDP 则是不可靠信道。
UDP 的应用场景
UDP 不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP 较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。比如我们聊天用的 QQ 就是使用的UDP 协议,直播中也可以用 UDP。
QQ 并不是端对端的聊天软件,是得经过服务器转发消息的,通过 QQ 聊天,数据是 A 发到服务器,服务器再转发到 B。
每一个 QQ 客户端之间的交互,实际上都是和服务器交互,再由服务器转发给正在通信的用户。
如果每一个 QQ 用户从一上线到下线的这段时间全部采用 TCP 长连接,对服务器的负担很大;而如果采用 TCP 短连接,频繁的连接断开也会造成网络负担。而采用 UDP 则可以避开上述麻烦,减少服务器的负担。
登陆成功之后,QQ 都会有一个 TCP 连接来保持在线状态。QQ 采用的通信协议以 UDP 为主,辅以 TCP 协议。QQ 的服务器要同时容纳十几万的并发连接,因此服务器端只有采用 UDP 协议与客户端进行通讯才能保证这种超大规模的服务。
QQ 客户端之间的消息传送也采用了 UDP 模式,因为国内的网络环境非常复杂,而且很多用户采用的方式是通过代理服务器共享一条线路上网的方式,在这些复杂的情况下,客户端之间能彼此建立起来 TCP 连接的概率较小,严重影响传送信息的效率。而UDP 包能够穿透大部分的代理服务器,因此 QQ 选择了 UDP 作为客户之间的主要通信协议。采用 UDP 协议,通过服务器中转方式。因此,现在的 IP 侦探在你仅仅跟对方发送聊天消息的时候是无法获取到IP的。
大家都知道,UDP 协议是不可靠协议,它只管发送,不管对方是否收到的,但它的传输很高效。但是作为聊天软件,怎么可以采用这样的不可靠方式来传输消息呢?于是,腾讯采用了上层协议来保证可靠传输:如果客户端使用 UDP 协议发出消息后,服务器收到该包,需要使用 UDP 协议发回一个应答包,如此来保证消息可以无遗漏传输。之所以会发生在客户端明明看到"消息发送失败"但对方又收到了这个消息的情况,就是因为客户端发出的消息服务器已经收到并转发成功,但客户端由于网络原因没有收到服务器的应答包引起的。
Telegram 端对端加密
端到端加密是一种目前比较安全的通信系统。在这个系统中,只有参与通信的双方用户可以读取通信数据。
如何实现UDP保证有序传输
- 发送:包的分片、包确认、包的重发
- 接收:包的调序、包的序号确认
建立缓冲区,由一个线程专门接受数据并且重排,但是这个是在UDP的基础上自己实现部分简单的TCP。即收到数据包检查无误后返回一个应答。如果发送端在一定时间内没有收到应答,就自动重发。
目前已有如下开源程序利用 UDP 实现了可靠的数据传输,分别为:RUDP、RTP、UDT
在浏览器中输入网址
- 查找域名对应的IP地址。这一步会依次查找浏览器缓存,系统缓存,路由器缓存,ISPDNS缓存,根域名服务器
- 浏览器向IP对应的web服务器发送一个HTTP请求
- 服务器响应请求,发回网页内容
- 浏览器解析网页内容
OSI七层模型
TCP/IP四层模型
-
主机到网络层
实际上TCP/IP参考模型没有真正描述这一层的实现,只是要求能够提供给其上层-网络互连层一个访问接口,以便在其上传递IP分组。由于这一层次未被定义,所以其具体的实现方法将随着网络类型的不同而不同。 -
网络互连层
网络互连层是整个TCP/IP协议栈的核心。它的功能是把分组发往目标网络或主机。同时,为了尽快地发送分组,可能需要沿不同的路径同时进行分组传递。因此,分组到达的顺序和发送的顺序可能不同,这就需要上层必须对分组进行排序。
网络互连层定义了分组格式和协议,即IP协议(Internet Protocol)。
网络互连层除了需要完成路由的功能外,也可以完成将不同类型的网络(异构网)互连的任务。除此之外,网络互连层还需要完成拥塞控制的功能。 -
传输层
在TCP/IP模型中,传输层的功能是使源端主机和目标端主机上的对等实体可以进行会话。在传输层定义了两种服务质量不同的协议。即:传输控制协议TCP(transmission control protocol)和用户数据报协议UDP(user datagram protocol)。
TCP协议是一个面向连接的、可靠的协议。它将一台主机发出的字节流无差错地发往互联网上的其他主机。在发送端,它负责把上层传送下来的字节流分成报文段并传递给下层。在接收端,它负责把收到的报文进行重组后递交给上层。TCP协议还要处理端到端的流量控制,以避免缓慢接收的接收方没有足够的缓冲区接收发送方发送的大量数据。
UDP协议是一个不可靠的、无连接协议,主要适用于不需要对报文进行排序和流量控制的场合。 -
应用层
TCP/IP模型将OSI参考模型中的会话层和表示层的功能合并到应用层实现。
应用层面向不同的网络应用引入了不同的应用层协议。其中,有基于TCP协议的,如文件传输协议(File Transfer Protocol,FTP)、虚拟终端协议(TELNET)、超文本链接协议(Hyper Text Transfer Protocol,HTTP),也有基于UDP协议的。应用层面向不同的网络应用引入了不同的应用层协议。其中,有基于TCP协议的,如文件传输协议(File Transfer Protocol,FTP)、虚拟终端协议(TELNET)、超文本链接协议(Hyper Text Transfer Protocol,HTTP),也有基于UDP协议的。
上层屏蔽下层细节,只使用其提供的服务。高内聚低耦合,每一层专注于其功能,各层之间的关系依赖不大。
拥塞控制
如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞程度更高。因此当出现拥塞时,应当控制发送方的速率。这一点和流量控制很像,但是出发点不同。流量控制是为了让接收方能来得及接收,而拥塞控制是为了降低整个网络的拥塞程度。
TCP 主要通过四个算法来进行拥塞控制:慢开始、拥塞避免、快重传、快恢复。
发送方需要维护一个叫做拥塞窗口(cwnd)的状态变量,注意拥塞窗口与发送方窗口的区别:拥塞窗口只是一个状态变量,实际决定发送方能发送多少数据的是发送方窗口。