目录
总结一下常见的网络协议,了解其含义和特有的知识点,力图形成一个知识框架,方便查阅和回顾。
首先梳理一下OSI各个层次,如下:
层次 | 作用 | 协议 | 传输单位 |
应用 | 为应用程序提供服务 | FTP, HTTP, DNS | 报文 message |
表示 | 数据格式转换 | CSS, HTML, GIF | |
会话 | 建立、维护、管理会话 | HTTP, SSH, SMTP, FTP | |
传输 | 建立、维护、管理端到端的链接,控制数据传输方式 | TCP(Transmission Control Protocol), UDP | 报文段 segment |
网络 | 数据传输线路选择,IP地址及路由选择 | IP/ICMP | 分组 packet |
数据链路 | 提供介质访问和链路管理 | ARP/RARP/MAC | 帧 frame |
物理 | 以二进制形式在物理媒介上传输数据 | DSL | 位 bit |
网络模型为什么要分层?
1、各层之间相互独立又相互合作,高层不需要知道底层的功能具体怎么实现的,只需要通过底层的接口来获得所需要的服务;
2、灵活性好,某一层发生改变,只要接口不变,不会对其他层造成大的影响;
3、提供好的兼容性,不同厂商的接口标准,使得各个厂商可以设计能够互操作的网络设备,保证甚至加快数据通信网络发展;
4、防止一个区域网络的变化移向另一个区域的网络,因此,每一个区域的网络能单独快速升级;
5、把复杂的网络问题分解为小的简单问题,易于学习和操作
一、TCP/IP
顾名思义,传输控制协议(TCP,Transmission Control Protocol)是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。
1、连接机制 - 三次握手
简单解释
- 第一次: 客户端 - - > 服务器,此时服务器知道了客户端要建立连接了 ;
- 第二次: 客户端 < - - 服务器,此时客户端知道服务器收到连接请求了 ;
- 第三次: 客户端 - - > 服务器,此时服务器知道客户端收到了自己的回应。
三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。
图形描述
正式描述
当主动方发出SYN连接请求后,等待对方回答。SYN+ACK,并最终对对方的 SYN 执行 ACK 确认。
这种建立连接的方法可以防止产生错误的连接,TCP使用的流量控制协议是可变大小的滑动窗口协议。
TCP三次握手的过程如下:
-
客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。
-
服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。
-
客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。
三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。
-
为什么不用两次?
主要是为了防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送的第一个请求连接并且没有丢失,只是因为在网络中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时之前滞留的那一次请求连接,因为网络通畅了, 到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。
如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。
-
为什么不用四次?
因为三次已经可以满足需要了, 四次就多余了.
2、终止机制 - 四次挥手
建立一个连接需要三次握手,而终止一个连接要经过四次握手,这是由TCP的半关闭(half-close)造成的。具体过程如下图所示。
详细过程
- 1、客户端进程发出连接释放报文,并且停止发送数据。
释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
- 2、服务器收到连接释放报文,发出确认报文。
ACK=1,确认序号为 u+1,并且带上自己的序列号seq=v,此时服务端就进入了CLOSE-WAIT(关闭等待)状态。 TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
- 3、客户端收到服务器的确认请求后,此时客户端就进入FIN-WAIT-2(终止等待2)状态
等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最终数据)
- 4, 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文
FIN=1,确认序号为v+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
- 5、客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,确认序号为w+1,而自己的序列号是u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。
注意此时TCP连接还没有释放,必须经过2∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
- 6、服务器只要收到了客户端发出的确认,立即进入CLOSED状态。
同样,撤销TCB(控制块TCB)后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
-
为什么最后客户端还要等待 2*MSL的时间呢?
MSL(Maximum Segment Lifetime),TCP允许不同的实现可以设置不同的MSL值。
- 第一,保证客户端发送的最后一个ACK报文能够到达服务器。
因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。
- 第二,防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。
客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文。
-
为什么建立连接是三次握手,关闭连接确是四次挥手呢?
建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。
而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。
-
如果已经建立了连接, 但是客户端突发故障了怎么办?
TCP设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75分钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
3、TCP特点
TCP协议作为传输层主要协议之一,具有以下特点:
- 面向连接;
- 端到端,可靠的全双工通信;三次握手,超时重传,滑动窗口,拥塞控制。
- 面向字节流;
4、TCP字段
虽然TCP面向字节流,但TCP传输的数据单元却是报文段。TCP报文段分为TCP首部和数据部分,TCP报文段首部的前20个字节是固定的,后面有4*n字节根据需要动态添加的选项,最大长度为40字节。
- 源端口和目的端口 各占两个字节,TCP的分用功能也是通过端口实现的。
- 序号 占4个字节,范围是[0,232],TCP是面向字节流的,每个字节都是按顺序编号。例如一个报文段,序号字段是201,携带数据长度是100,那么第一个数据的序号就是201,最后一个就是300。当达到最大范围,又从0开始。
- 确认号 占4个字节,是期望收到对方下一个报文段的第一个字节的序号。若确认号=N,则表示序号N前所有的数据已经正确收到了。
- 数据偏移 占4位,表示报文段的数据部分的起始位置,距离整个报文段的起始位置的距离。间接的指出首部的长度。
- 保留 占6位,保留使用,目前为0.
- URG(紧急) 当URG=1,表明紧急指针字段有效,该报文段有紧急数据,应尽快发送。
- ACK(确认) 仅当ACK=1时,确认号才有效,连接建立后,所有的报文段ACK都为1。
- PSH(推送) 接收方接收到PSH=1的报文段,会尽快交付接收应用经常,不再等待整个缓存填满再交付。实际较少使用。
- RST(复位) RST=1时,表明TCP连接中出现严重差错,必须是否连接,再重连。
- SYN(同步) 在建立连接时用来同步序号。当SYN=1,ACK=0,则表明是一个连接请求报文段。SYN=1,ACK=1则表示对方同意连接。TCP建立连接用到。
- FIN(终止) 用来释放一个连接窗口。当FIN=1时,表明此报文段的发送方不再发送数据,请求释放单向连接。TCP断开连接用到。
- 窗口 占2个字节,表示发送方自己的接收窗口,窗口值用来告诉对方允许发送的数据量。
- 校验和 占2字节,检验和字段查验范围包括首部和数据部分。
- 紧急指针 占2字节,URG=1时,紧急指针指出本报文段中的紧急数据的字节数(紧急字节数结束后为普通字节)。
- 选项 长度可变,最长可达40字节。例如最大报文段长度MSS。MSS指的是数据部分的长度而不是整个TCP报文段长度,MSS默认为536字节长。窗口扩大,时间戳选项等。
二、UDP
UDP协议,即用户数据报协议(User Datagram Protocol),是一个简单的面向数据报的传输层协议。UDP协议只在IP数据报服务上增加了很少一点的功能,就是复用和分用,以及差错检测的功能。
1、UDP特点
- 无连接:发送数据之前不需要建立连接,减少了开销和发送数据之前的时延;
- 尽最大努力交付(不可靠),主机不需要维护连接状态表;
- 面向报文,UDP对应用层交下来的数据只添加首部,并进行特别的处理,就交给网络层;对网络层传递上来的用户数据报拆封首部后,原封不动的交给应用层。
- 优点
- UDP
没有拥塞控制
,网络出现的拥塞不会使源主机的发送速率降低。这对某些实时应用是很重要的 - UDP 支持一对一、一对多、多对一和多对多的交互通信
- UDP 的
首部开销小
,只有8个字节,比 TCP 的20个字节的首部要
- 缺点
- 某些实时应用需要使用没有拥塞控制的 UDP,但很多的源主机同时都向网络发送高速率的实时视频流时,网络就有可能发生拥塞,导致大家都无法正常接收。
- 还有一些使用 UDP 的实时应用,需要对 UDP 的不可靠传输进行适当的改进,以减少数据的丢失。应用进程可以在不影响应用的实时性的前提下,增加一些提高可靠性的措施,如采用前向纠错或重传已丢失的报文
2、UDP首部
用户数据报UDP分为两个字段:数据字段和首部字段,从图来分析用户数据报UDP的首部格式。
UDP首部字段很简单,由4个字段组成,每个字段的长度都是两个字节,共8字节。
- 源端口 原端口号,在需要对方回信时选用,不需要时可全0
- 目的端口 目的端口号,这在终点交付报文时必须使用,不然数据交给谁呢?
- 长度 UDP的长度,最小值为8字节,仅有首部
- 检验和 检测用户数据报在传输过程是否有错,有错就丢弃。
在传输的过程中,如果接收方UDP发现收到的报文中的目的端口不存在,会直接丢弃,然后由网际控制报文协议ICMP给发送方发送“端口不可达”差错报文。
3、伪首部
计算校验和时,需要在UDP之前增加12个字节的伪首部。这种首部并不是用户数据报的真正首部。伪首部并不在网络中传输,只是在计算检验和,临时添加在UDP用户数据报前,得到一个临时的用户数据报。
UDP的校验和是把首部和数据部分一起校验,发送方计算校验和的一般步骤:
- 将首部的校验和字段填充为0(零)
- 把伪首部和用户数据报UDP看出16位的字符串连接起来
- 如果数据部分不是偶数字节,则填充一个全零字节(该字节不发送到网络层)
- 按二进制反马计算出这些16位字的和
- 然后将和写入校验和字段,就可以发送到网络层了。
接收方收到用户数据报后,连同伪首部一起,按二进制反码求这些16位字的和,无差错结果是应全为1.否则出错,直接丢弃该报文。
三、HTTP
1、一次完整的HTTP请求
大致有7个步骤
(1)域名解析;
(2)与服务器建立连接(TCP连接);
(3)发起HTTP请求;
(4)服务器响应HTTP请求(涉及负载均衡、软硬件方案;数据库;redis等),浏览器得到HTML代码;
(5)浏览器解析HTML代码,请求代码中的资源,如js, css, 图片等;
(6)浏览器根据资源对页面进行渲染呈现给用户。
详细的步骤参见一篇博客:https://www.jianshu.com/p/eb8eb4ea7286
2、请说明一下http和https的区别
考察点:http协议
https协议要申请证书到ca,需要一定经济成本;2) http是明文传输,https是加密的安全传输;3) 连接的端口不一样,http是80,https是443;4)http连接很简单,没有状态;https是ssl加密的传输,身份认证的网络协议,相对http传输比较安全。
经济成本 | 传输 | 连接的端口 | 安全 | |
http | 明文传输 | 80 | http连接很简单,没有状态 | |
https | 要申请证书到ca,需要一定经济成本 | 加密的安全传输 | 443 | ssl加密的传输,身份认证的网络协议,相对http传输比较安全 |
3、http和服务器交互的几种方式?
- get和post
- put,delete
4、get和post的区别
- get会将请求参数添加到url后面,安全性低,并且受到url长度的限制,一般是用来获取资源的;
- post不会将参数跟在url后面,安全性高,参数长度不受url限制,一般是用来更新资源的)
请你讲一下路由器和交换机的区别?
- 1、工作层次不同,路由器网络层、交换机数据链路层;
- 2、寻址依据不同,路由器基于IP寻址,交换机基于MAC寻址;
- 3、交换机分割冲突域,不划分广播域,即隶属一个交换机的主机属于一个局域网。通过路由器连接的主机可能数据不同的广播域,所以路由器可以划分广播域;
- 4、转发的数据对象不同 ,交换机转发的是数据帧、路由器转发的是分组报文