计算机网络

2019/12/01 Networks

这篇文章主要总结了一些常见的计算机网络问题。

F&Q

TCP协议与UDP协议的区别是什么?

TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议,在收发数据前,必须和对方建立可靠的连接。UDP是一个非连接的协议,传输数据之前源端和终端不建立连接。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。

两者的区别大致如下:

TCP面向连接,UDP面向非连接即发送数据前不需要建立链接 TCP提供可靠的服务(数据传输),UDP无法保证 TCP面向字节流,UDP面向报文 TCP数据传输慢,UDP数据传输快

打比方:TCP就像是打电话,稳定并且相互通讯;UDP就像是发短信,收不收到是你的事儿。

常见的端口和对应的服务有哪些?

端口21:FTP文件传输协议 端口22:SSH 端口23:Telnet远程登录服务 端口25:SMTP简单邮件传输协议 端口53:DNS域名服务器 端口80:HTTP超文本传输协议 端口110:POP3 端口443:HTTPS 端口1080:sockets 端口1521:oracle数据库默认端口 端口3306:MySQL数据库默认端口

TCP三次握手和四次挥手的过程?

那么为什么建立连接需要三次交互,而断开连接的时候是四次?因为建立连接时,被动方服务器端结束CLOSED阶段进入”握手”阶段并不需要任何准备,可以直接返回SYN和ACK报文,开始建立连接。而当释放连接时,被动方服务器,突然收到主动方客户端释放连接的请求时并不能立即释放连接,因为还有必要的数据需要处理,所以服务器先返回ACK确认收到报文,经过CLOSE-WAIT阶段准备好释放连接之后,才能返回FIN释放连接报文。

需要理解ACK、FIN、SYN标志位的意义,以及seq和ack的序号关系。

IPv4地址的分类?

类别 网络号 地址范围 网络号位数 主机号位数
A类 0开头 1.0.0.0 - 126.0.0.0 8 24
B类 10开头 128.0.0.0 - 191.255.0.0 16 16
C类 110开头 192.0.0.0 - 223.255.255.0 24 8
D类 1110开头 / / /
E类 11110开头 / / /

D类地址为多播地址,多播组号28位;E类地址保留使用;IPv4地址共32位,127.0.0.1是本地环回地址;全0和全1地址不使用;三类私有地址如下:

类别 范围
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

在浏览器中输入网址www.baidu.com之后会发生什么?

  1. 客户端浏览器通过DNS解析到www.baidu.com的IP地址220.181.27.48,通过这个IP地址找到客户端到服务器的路径。客户端浏览器发起一个HTTP会话到220.161.27.48,然后通过TCP进行封装数据包,输入到网络层。

  2. 在客户端的传输层,把HTTP会话请求分成报文段,添加源和目的端口,如服务器使用80端口监听客户端的请求,客户端由系统随机选择一个端口如5000,与服务器进行交换,服务器把相应的请求返回给客户端的5000端口。然后使用IP层的IP地址查找目的端。

  3. 客户端的网络层不用关系应用层或者传输层的东西,主要做的是通过查找路由表确定如何到达服务器,期间可能经过多个路由器,这些都是由路由器来完成的工作,我不作过多的描述,无非就是通过查找路由表决定通过那个路径到达服务器。

  4. 客户端的链路层,包通过链路层发送到路由器,通过邻居协议查找给定IP地址的MAC地址,然后发送ARP请求查找目的地址,如果得到回应后就可以使用ARP的请求应答交换的IP数据包现在就可以传输了,然后发送IP数据包到达服务器的地址。

PS: 可以自由发挥。例如经过边际路由、经过防火墙、经过代理服务器、经过NAT地址转换、经过CDN加速等等。

TCP/IP模型与OSI七层模型

讲一讲对TCP连接的流量控制和拥塞控制。

TCP的流量控制是通过滑动窗口协议来实现的。流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。滑动窗口本质上是描述接受方的TCP数据报缓冲区大小的数据,发送方根据这个数据来计算自己最多能发送多长的数据。如果发送方收到接受方的窗口大小为0的TCP数据报,那么发送方将停止发送数据,等到接受方发送窗口大小不为0的数据报的到来。需要注意的是滑动窗口的大小是由对方来设定的。

TCP的拥塞控制是强调全局范围,目的是为了防止过多的数据包注入到整个网络中,涉及到所有的主机、路由器,以及与降低网络性能有关的所有因素。常见的拥塞控制的方法有慢启动、拥塞避免、快速重传、快速恢复。

发送方维护一个拥塞窗口cwnd的状态变量。只要网络没有出现拥塞,那么拥塞窗口就增大一些;一旦网络出现了拥塞,拥塞窗口就减少一些。发送方在没有按时收到应当到达的确认报文时(发生重传),判断网络出现拥塞。发送方同时维护一个慢开始门限ssthresh,该值用于判断当前需要使用慢开始算法还是拥塞避免算法。

在tcp双方建立逻辑链接关系时,拥塞窗口cwnd的值被设置为1,还需设置慢开始门限ssthresh,在执行慢开始算法时,发送方每收到一个对新报文段的确认时,就把拥塞窗口cwnd的值加一,然后开始下一轮的传输,当拥塞窗口cwnd增长到慢开始门限值时,就使用拥塞避免算法。拥塞避免算法中,每个传输轮次拥塞窗口cwnd只能线性加一,而慢开始算法中拥塞窗口cwnd按指数增长。慢开始强调的是一开始向网络注入的报文数量少,而不是说拥塞窗口增长的速度慢。

快速重传是指让发送快尽快进行重传,而不是等超时重传计数器超时之后再重传。发送方一旦收到了3个连续的重复确认,就会将相应的报文段立刻重传。此时发送方知道现在只是丢失了个别的报文段,因此不采用慢开始算法,而是执行快速恢复算法。快速恢复是指发送方将ssthresh和cwnd调整为当前窗口的一般,然后执行拥塞避免算法。

HTTP与HTTPs的区别,描述一下HTTPs的运作流程。

HTTP属于超文本传输协议,用来在Internet上传送超文本,而HTTPS为安全超文本传输协议,在HTTPS基础上拥有更强的安全性,简单来说HTTPS是HTTP的安全版,是使用TLS/SSL加密的HTTP协议。

HTTP的几个特点:

  1. 无状态:协议对客户端没有状态存储,对事物处理没有“记忆”能力,比如访问一个网站需要反复进行登录操作。

  2. 无连接:HTTP/1.1之前,由于无状态特点,每次请求需要通过TCP三次握手四次挥手,和服务器重新建立连接。比如某个客户机在短时间多次请求同一个资源,服务器并不能区别是否已经响应过用户的请求,所以每次需要重新响应请求,需要耗费不必要的时间和流量。

  3. 基于请求和响应:基本的特性,由客户端发起请求,服务端响应。

  4. 通信使用明文、请求和响应不会对通信方进行确认、无法保护数据的完整性。

HTTPS的建立过程:

  1. client向server发送请求,连接到server的443端口。

  2. 图片中显示的是生成公私钥对,而实际上这里应该是指服务端准备数字证书。服务端开启https的前提是需要向CA申请数字证书。

  3. server向client传输证书的公钥,还包含其他的信息,例如证书的颁发机构、过期时间、第三方证书认证机构的签名、服务端的域名信息等等。

  4. client解析证书,这部分工作是由client的TLS来完成的。client验证公钥是否有效,例如颁发机构、过期时间等,如果发现有异常,则弹出一个警告框提示证书有问题。如果没有问题,则生成一个随机数,这个随机数是后面的会话密钥的组成部分。

  5. client用证书的公钥对这个随机数加密,然后发送给server。

  6. server收到信息后用私钥解密得到这个随机数,随后生成会话密钥。此时server和client拥有相同的会话密钥。

  7. 双方使用会话密钥对通信的内容进行加密、解密。此时SSL层已经建立完成。

什么是SSL,什么是TLS?

SSL(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL记录协议和SSL握手协议。SSL记录协议(SSL Record Protocol)建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。SSL握手协议(SSL Handshake Protocol)建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。

TLS(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。该协议由两层组成:TLS记录协议和TLS握手协议。TLS与SSL有类似之处,TLS是SSL标准化后的产物。注意看图中,SSL/TLS是运行在传输层之上,应用层之下。

HTTP请求的过程,如何解决HTTP无状态的问题?

第一种是通过Cookie/Session技术;第二种是HTTP/1.1持久连接(HTTP keep-alive)方法,只要任意一端没有明确提出断开连接,则保持TCP连接状态,在请求首部字段中的Connection: keep-alive即为表明使用了持久连接。

Cookie是客户端的存储空间,由浏览器来维持。具体来说cookie机制采用的是在客户端保持状态的方案。Cookie根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的首部字段信息,通知客户端保存Cookie,当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie值后发送出去。Cookie是服务器生成的,发送给客户端,并且由客户端来保存。每次请求加上Cookie就行了。服务器端发现客户端发送过来的Cookie后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。

Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是Session。客户端浏览器再次访问时,只需要从该Session中查找该客户的状态就可以了。虽然Session保存在服务器,对客户端是透明的,它的正常运行仍然需要客户端浏览器的支持。这是因为Session需要使用Cookie作为识别标志。

Cookie与Session的区别:(1)Cookie数据存放在客户的浏览器上,Session数据放在服务器上;(2)Cookie不是很安全,别人可以分析存放在本地的Cookie并进行Cookie欺骗,考虑到安全应当使用Session;(3)Session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。考虑到减轻服务器性能方面,应当使用Cookie;

GET和POST的区别。

GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。下面给出一般理解:

  1. GET后退按钮/刷新无害,POST数据会被重新提交(浏览器应该告知用户数据会被重新提交)。

  2. GET书签可收藏,POST为书签不可收藏。GET能被缓存,POST不能缓存。

  3. GET历史参数保留在浏览器历史中。POST参数不会保存在浏览器历史中。

  4. GET对数据长度有限制,当发送数据时,GET方法向URL添加数据;URL的长度是受限制的(URL的最大长度2048个字符)。POST无限制。GET只允许 ASCII 字符。POST没有限制,也允许二进制数据。

  5. 与POST相比,GET的安全性较差,因为所发送的数据是URL的一部分。GET的数据在URL中对所有人都是可见的。POST的数据不会显示在URL中。

  6. (拓展) GET产生一个TCP数据包;POST产生两个TCP数据包。对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

参考资料

SSL/TLS协议运行机制的概述

Search

    Table of Contents