计算机网络复习笔记
概述
网络模型与相关协议
OSI七层模型:
物理层
数据链路层:PPP,MAC
网络层:IP,ARP,ICMP
运输层: TCP、UDP
会话层
表示层
应用层:DNS、HTTP、SMTP等
TCP/IP四层协议
网络接口层
网际层:IP
运输层:TCP、UDP
应用层:HTTP、SMTP、FTP等
五层协议
物理层:实现相邻计算机之间比特流的透明传递
数据链路层:将IP数据报组装成帧,控制信息在相邻两节点的链路上进行传输
网络层:IP,为不同主机分组交换信息服务
运输层:TCP、UDP,为两台主机之间的通信提供通用的数据传输服务
应用层:HTTP、SMTP、FTP等
TCP/IP协议体系的认知
计算机网络主要指的就是TCP/IP协议栈,是互联网的基石,容易忘是因为TCP/IP技术栈有一大部分都隐藏于操作系统的内核态,较少被接触。
(1)分层。一部分处于用户态,一部分处于内核态。数据链路层,网络层,传输层封装于操作系统内核态。应用层存在于操作系统的用户空间,包括DNS,FTP,HTTPs,HTTP,工作中接触较多的是应用层的部分。但其它层的原理必须理解,面试考察。
(2)层与层之间下层对上层是透明的,传输在每一层是对等的。
基本单位
1.报文(message)
报文是网络中交换与传输的数据单元,也是网络传输的单元。报文包含了将要发送的完整的数据信息,其长短不需一致。报文在传输过程中会不断地封装成分组、包、帧来传输,封装的方式就是添加一些控制信息组成的首部,那些就是报文头
2.分组(packet)
分组是在网络中传输的二进制格式的单元,为了提供通信性能和可靠性,每个用户发送的数据会被分成多个更小的部分。在每个部分的前面加上一些必要的控制信息组成的首部,有时也会加上尾部,就构成了一个分组
3.数据包(data packet)
数据包是TCP/IP协议通信传输中的数据单元,也称为“包”。是指自包含的,带有足够寻址信息,可独立地从源主机传输到目的主机,而不需要依赖早期的源主机和目的主机之间交换信息以及传输网络的数据包
4.数据报(datagram)
面向无连接的数据传输,其工作过程类似于报文交换。采用数据报方式传输时,被传输的分组称为数据报
5.帧(frame)
帧是数据链路层的传输单元。它将上层传入的数据添加一个头部和尾部,组成了帧。
数据链路层
交换机与路由器的区别
- 工作层次不同,交换机工作在数据链路层,路由器工作在网络层
- 寻址依据不同,交换机的数据转发依据是利用物理地址或者说MAC地址来确定转发数据的目的地址,而路由器是依据ip地址进行工作的
- 交换机分割冲突域,不划分广播域,即隶属一个交换机的主机属于一个局域网。通过路由器连接的主机可能数据不同的广播域,所以路由器可以划分广播域
- 转发的数据对象不同 ,交换机转发的是数据帧、路由器转发的是分组报文
ARP协议
在OSI模型中ARP协议属于链路层;而在TCP/IP模型中,ARP协议属于网络层。ARP是IP地址解析为MAC地址 RARP 将MAC地址解析为IP地址
ARP攻击
①ARP缓存表基于"后到优先"原则,IP与MAC的映射信息能被覆盖;
②ARP攻击基于伪造的ARP回应包,黑客通过构造"错位"的IP和MAC映射,覆盖主机的ARP表(也被称为"ARP毒化"),最终截取用户的数据流;
③一旦遭受ARP攻击,账号密码都可能被窃取(如果通信协议不是加密的);
④通过Wireshark数据包分析,我们掌握了真实网络中ARP底层攻击原理及数据包组成。
网络层
主要任务是把分组从源端传到目的端,为分组交换网上的不同主机提供通信服务。网络层的传输单位是数据报。
在这里先理清几个概念:
报文(message):传输协议交给ip的数据称为报文;典型的报文包含一个传输层首部和应用程序数据;
数据报(datagram):在报文首部加上ip首部形成一个数据报;
分片(fragment):如果在选定网络中,数据报的长度太大,ip就会把数据报分裂成几个分片,每个分片含有它自己的ip首部和一段原来数据报的数据;
分组(packet):提交给数据链路层进行传送时,一个ip分片或者一个很小的无需分片的ip数据报成为分组;可以明显看出分组与分片的区别。
网络层的功能
一、路由选择与转发
路由器主要完成两个功能:
- 路由选择(确定最佳路径)
- 分组转发 路由器根据转发表将用户的IP数据报从合适端口转发出去
二、实现异构网络的互连
用中继设备将两种不同的网络互联
网络层的中继设备就是路由器,网络层以上的中继设备是网关
三、拥塞控制
如果出现过量的分组,会让结点来不及接收,要面临丢弃大量分组的情况。这时网络就处于拥塞状态,需要采取一定措施来缓解这种拥塞。
这是全局性的,涉及各方面的行为。而流量控制往往是指在发送端和接收端之间点对点通信量的控制。
有两种控制方法:开环控制和闭环控制
路由算法
路由器的分组转发是通过路由表的,所以路由表至关重要。
路由表内容有:1.目的网络IP地址 2.子网掩码 3. 下一跳IP地址 4. 接口
路由表的内容是由路由算法得到的
一、距离向量路由算法 RIP
路由器只掌握物理相连的邻居及链路费用
二、链路状态路由算法 OSPF
所有路由器掌握完整的网络拓扑和链路费用信息
三、层次路由
-
网络规模很大,路由器的路由表也成比例增大
-
许多单位不想让外界知道自己的路由选择协议,但还想连入因特网
因特网将整个互联网划分成许多较小的自治系统AS,每个自治系统都有权决定本系统内应采取何种路由选择协议
- 内部网关协议IGP:一个AS内所使用的
- 外部网关协议EGP:AS之间使用的 BGP
IP数据报
格式:
- 首部长度:最小为4*5=20B
- 8位生存时间:经过一个路由器-1,变成0就丢弃,这个字段的最大值也就是255,也就是说一个协议包也就在路由器里面穿行255次就会被抛弃了,根据系统的不同,这个数字也不一样,一般是32或者是64。
- 片偏移:单位8B,表示在原来分组中的相对位置
- DF:禁止分片
- MF:后面还有分片,代表最后一片
以太网的最大传送单元(MTU)是1500字节
依据MTU来分片,每个分片都要有首部
掌握如何IP分片:如总长大于MTU值,画分片情况;如何避免IP分片(在应用层或传输层做限制);确定分片顺序;确定分片是否全部到达。
IP协议是TCP/IP协议的核心,所有的TCP,UDP,IMCP,IGMP的数据都以IP数据格式传输。要注意的是,IP不是可靠的协议,这是说,IP协议没有提供一种数据未传达以后的处理机制,这被认为是上层协议:TCP或UDP要做的事情。
IP地址
在同一个局域网上的主机或路由器的ip地址中的网络号是一样的。路由器总是有两个或两个以上的IP地址,路由器的每个端口都有一个不同网络号的IP地址。
32位IP地址分为网络位和地址位,这样做可以减少路由器中路由表记录的数目,有了网络地址,就可以限定拥有相同网络地址的终端都在同一个范围内,那么路由表只需要维护一条这个网络地址的方向,就可以找到相应的这些终端了。
- A类IP地址: 0.0.0.0~127.255.255.255
- B类IP地址:128.0.0.0~191.255.255.255
- C类IP地址:192.0.0.0~239.255.255.255
网络地址转换NAT
可以发现VPN协议和NAT协议都是通过重新构建一个IP首部来实现的,但他们的实现又有区别,VPN是将内部IP数据报加密后打包成外部IP数据报的数据部分,它的主要目的是为了数据的保密性,而NAT是纯进行地址转换,它的目的是为了解决本地编址的内部网络与外网通信的问题。
ICMP协议
它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。理解为网络层和传输层的中间协议
ping
ping可以说是ICMP的最著名的应用,是TCP/IP协议的一部分。利用“ping”命令可以检查网络是否连通,可以很好地帮助我们分析和判定网络故障。
它利用ICMP协议包来侦测另一个主机是否可达。原理是用类型码为0的ICMP发请求,受到请求的主机则用类型码为8的ICMP回应。
ping程序来计算间隔时间,并计算有多少个包被送达。用户就可以判断网络大致的情况。 ping给出来了传送的时间和TTL的数据。
Traceroute
Traceroute是用来侦测主机到目的主机之间所经路由情况的重要工具,也是最便利的工具。
原理:它收到目的主机的IP后,首先给目的主机发送一个TTL=1的UDP数据包,而经过的第一个路由器收到这个数据包以后,就自动把TTL减1,而TTL变为0以后,路由器就把这个包给抛弃了,并同时产生一个主机不可达的ICMP数据报给主机。主机收到这个数据报以后再发一个TTL=2的UDP数据报给目的主机,然后刺激第二个路由器给主机发ICMP数据报。如此往复直到到达目的主机。这样,traceroute就拿到了所有的路由器IP。
运输层
TCP协议、UDP协议的区别
TCP提供可靠的、面向连接的运输服务。在传输数据之前必须三次握手建立连接,数据传输结束之后,4次挥手释放连接,而且在数据传递时,又有确认应答、超时重传、滑动窗口、拥塞控制等机制保证传送数据的可靠性。TCP经常用于对网络通信质量有很高要求的地方,如文件传输,邮件发送,远程登录等场景。SMTP、TELNET、HTTP、FTP
UDP在传送数据之前不需要建立连接,目的主机收到UDP报文后,不需要给出确认。UDP不提供可靠交付,一般用于即时通信,如语音、视频、直播等。RIP(路由选择协议),DNS
TCP三次握手
关键词:序列号seq
,确认号ack
,标识符SYN
,ACK
1)主机A向主机B发送TCP连接请求数据包,其中包含主机A的初始序列号seq(A)=x。(其中报文中同步标志位SYN=1,ACK=0,表示这是一个TCP连接请求数据报文;序号seq=x,表明传输数据时的第一个数据字节的序号是x);
2)主机B收到请求后,发回连接确认数据包。(其中确认报文段中,标识位SYN=1,ACK=1,表示这是TCP连接响应数据报文,并含主机B的初始序列号seq(B)=y,以及主机B对主机A初始序列号的确认ack(B)=seq(A)+1=x+1
3)第三次,主机A收到主机B的确认报文后,还需作出确认,即发送一个序列号seq(A)=x+1;确认号为ack(A)=y+1的报文;
为什么要三次握手?
为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
TCP四次挥手
1、客户端发送请求释放连接报文,FIN=1,seq=u;客户端进入FIN-WAIT-1状态;
2、服务器收到请求,发送确认报文。ACK=1,seq=v,ack=u+1;服务器进入CLOSE-WAIT状态。客户端收到后进入终止等待2FIN-WAIT-2;
3、服务器发送完数据之后,向客户端发送请求释放连接报文,FIN=1,ACK=1,seq=w,ack=u+1;进入LAST-ACK状态
4、客户端收到请求后,发送确认报文,ACK=1,seq=u+1,ack=w+1。客户端进入TIME-WAIT状态,等待2MSL后进如CLOSED状态,服务器收到确认后进如CLOSED状态。
为什么要四次分手?
TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。
TIME_WAIT状态为什么要等待2MSL?
因为第四次的确认报文可能丢失,这个状态是用来重发可能丢失的ACK报文。
MSL:最长报文段寿命
为什么会有CLOSE_WAIT?
因为服务器可能有数据未发送完毕,这段时间是继续发送数据的。
如果建立连接之后出现故障?
TCP有个保活计时器,通常设置为2小时,两小时内没有收到客户端发送的数据,服务器发送探测报文,每75s发送一次,10次之后探测报文没有反应,认为出现故障,关闭连接。
TIME_WAIT存在的两个理由:
1、可靠的实现TCP全双工连接的终止
2、允许老的重复的分节在网络上的消逝(TCP不允许处于TIME_WAIT状态的连接启动一个新的化身,因为TIME_WAIT状态持续2MSL,就可以保证当成功建立一个TC连接的时候,来自连接先前化身的重复分组已经在网络中消逝。)
TCP可靠传输
序列号确认应答
数据到达接收方,接收方需要发出一个确认应答,表示已经收到该数据段,并且确认序号会说明它下一个需要接收的数据序列号
如果发送方迟迟未收到确认应答,那么可能是发送的数据丢失,也可能是确认应答丢失,这时发送方在等待一段时间后会进行重传。这个时间一般是2*RTT(报文段往返时间)
滑动窗口
TCP通过滑动窗口的概念来进行流量控制,抑制发送端发送数据的速率,以便接收端来得及接收。
窗口:对应一段发送者可以发送的字节序列。这个序列是可以改变的。接收端发给发送端自己的接受能力。然后发送端根据已确认接受的序列号和接受能力滑动窗口,一下子全部发送,等待接收端确认。
拥塞控制和流量控制的区别
拥塞控制是防止过多的数据注入到网络中,可以使网络中的路由器或链路不致过载,是一个全局性的过程。
流量控制是点对点通信量的控制,主要就是抑制发送端发送数据的速率,以便接收端来得及接收。
(设置拥塞控制窗口cwnd, 在发送数据时,将拥塞窗口的大小与接收端ack的窗口大小做比较,取较小者作为发送数据量的上限。)
拥塞控制的过程
慢开始: 设置拥塞控制窗口cwnd = 1MSS(最大报文段),每收到一个ACK,cwnd++;每过1RTT,cwnd = cwnd * 2;呈指数增长。
拥塞避免:当拥塞窗口 cwnd 达到一个阈值时(cwnd >= ssthresh),窗口大小不再呈指数上升,而是以线性上升,避免增长过快导致网络拥塞。每当过了一个RTT,cwnd = cwnd + 1;
无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(没有收到确认ACK);拥塞窗口设置为1,阈值为拥塞时发送窗口的一半,执行慢开始算法。
快重传:当发送方连续收到三个重复确认时,就立即重传对方尚未收到的报文段。并执行快恢复算法
快恢复:将cwnd设置为ssthresh的大小,然后执行拥塞避免算法。
应用层
DNS
浏览器输入url并回车的过程以及相关协议
- 根据域名,进行DNS域名解析。
- 拿到解析的IP地址,建立TCP连接
- 发送HTTP请求
- 服务器处理请求
- 返回HTTP报文
- 关闭TCP链接
- 浏览器解析HTML
- 浏览器渲染页面
使用的协议:DNS(获取域名的IP的地址);TCP(与服务器建立TCP连接);IP(建立TCP协议时,需发送数据,在网络层用到IP协议);OPSF(IP数据包在路由之间传送,路由选择使用OPSF协议);ARP(路由器与服务器通信时,将IP地址转化为MAC地址,使用ARP协议);HTTP(TCP建立之后,使用HTTP协议访问网页);
DNS寻址
- 先查找浏览器缓存,如果没命中,查询系统缓存,即hosts文件。
- 如果没命中,查询路由器缓存。
- 如果没命中,请求本地域名服务器解析域名,没有命中就进入根服务器进行查询。
- 没有命中就返回顶级域名服务器IP给本地DNS服务器。
- 本地DNS服务器请求顶级域名服务器解析,没有命中就返回主域名服务器给本地DNS服务器。
- 本地DNS服务器请求主域名服务器解析域名,将结果返回给本地域名服务器。
- 本地域名服务器缓存结果并反馈给客户端。
DNS协议运行在UDP协议之上,使用端口号53
。
HTTP
HTTP1.1与1.0之间的区别:
- HTTP1.1默认开启长连接,在一个TCP连接上可以传送多个HTTP请求和响应。而1.0不支持长连接。客户端和服务器每进行一次HTTP操作,就建立一次连接。
- 缓存处理:在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
- Host头处理:1.0请求的url并没有传递主机名(服务器与IP地址绑定),1.1请求和响应都支持Host头域(虚拟主机共享IP地址)
- 1.1新增24个错误状态响应码。409:请求的资源和资源的当前状态冲突,410:服务器资源永久性删除
- 带宽优化以及网络连接的使用:1.1允许只请求资源的某个部分.
HTTP2.0和HTTP1.X相比的新特性
- 新的二进制格式:1.x的解析是基于文本的,而2.0的协议解析是采用二进制格式。
- 多路复用,即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request。
- header压缩。
- 服务端推送。
HTTP与HTTPS
- HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费。
- HTTP协议运行在TCP之上,传输的内容都是明文。HTTPS运行在SSL/TLS(运行在TCP之上)之上,内容加密。
- 连接端口不一样,http是
80
,https是443
. - http连接简单,没有状态,https是ssl加密的传输,身份认证的网络协议,更安全。
HTTPS在传统的HTTP和TCP之间加了一层用于加密解密的SSL/TLS层;采用对称加密和非对称加密结合的方式来保护浏览器和服务端之间的通信安全。对称加密:加密和解密都是同一个密钥。非对称加密:密钥成对出现,分为公钥和私钥,公钥和私钥之间不能互相推导,公钥加密需要私钥解密,私钥加密需要公钥解密。
HTTP请求有哪些
get
:请求特定资源post
:向指定资源提交数据进行处理请求Put
:向指定资源上传最新内容Delete
:请求删除资源。
get和post区别
- Get是从指定资源请求数据,而Post是向指定资源提交要被处理的数据。
- Get请求刷新无害,而post刷新,数据会被重复提交
- Get请求的数据会附加到URL中,多个参数用&连接,URL编码采用ASCII编码。而POST请求会把请求的数据放到body中。因此get请求的数据会暴露在地址栏中,而post不会。又浏览器和服务器对url的长度有限制,所以get传输数据的大小受到url的限制。
- Get请求的资源会被浏览器缓存。
- post比get慢,因为post在发送数据之前会先将请求头发送给服务器进行确认,然后才真正发送数据。而get请求直接发送请求头和数据。
状态码
304:客户端请求一个有缓存的资源,服务器返回304告诉客户端,自上次请求后,资源并没有更新,原本的缓存可以继续使用。
1xx:指示信息--表示请求已接收,继续处理
100 --客户端必须继续发出请求 101-客户端要求服务器转换HTTP协议版本。
2xx:成功--表示请求已被成功接收、理解、接受
200—OK 204--请求收到,但返回信息为空 206--服务器已经完成了部分用户的GET请求
3xx:重定向--信息不完整需要进一步补充
300 --- 请求资源在多处可得到。301—永久重定向,隐式重定向。302 临时重定向,显示重定向。
304—请求的资源没有改变,可以使用缓存。
4xx:客户端错误--请求有语法错误或请求无法实现
401---未授权 403—禁止访问。 404 –找不到。409:对当前资源状态,请求不能完成
5xx:服务器端错误--服务器未能实现合法的请求
500内部服务器错误,501未实现, 502网关错误,503服务不可用,504 网关超时。
转发和重定向的区别
转发(forward)是服务器行为,重定向是客户端行为。转发是服务器直接向目标地址访问URL,将相应内容读取之后发给浏览器,地址栏URL不变,转发页面和转发到的页面可以共享request里面的数据。效率高,可用于用户登录之后将角色转发到相应的模块。重定向是利用服务器返回的状态码来实现的,如果服务器返回301或者302,浏览器到新的网址重新请求资源。地址栏url会发生改变,而且不能共享数据。效率低,可用于用户注销之后,跳转到其他网站。
SSL四次握手
1、 客户端发出请求
首先,客户端(通常是浏览器)先向服务器发出加密通信的请求,这被叫做ClientHello请求。
2、服务器回应
服务器收到客户端请求后,向客户端发出回应,这叫做SeverHello。
3、客户端回应
客户端收到服务器回应以后,首先验证服务器证书。如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。
4、服务器的最后回应
服务器收到客户端的第三个随机数pre-master key之后,计算生成本次会话所用的"会话密钥"。然后,向客户端最后发送下面信息。
(1)编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
(2)服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验。
至此,整个握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普通的HTTP协议,只不过用"会话密钥"加密内容。
会话控制
cookie和session都是跟踪整个会话过程的技术手段。而会话,就是用户通过浏览器和服务器的一次通话。
因为HTTP协议是无状态的,服务器不知道用户上一次做了什么,这严重阻碍了交互式web应用程序的实现。HTTP不通过额外的手段,服务器并不知道用户做了什么,为了做到这一点,就需要使用cookie和session了。服务器可以设置或者读取cookie中包含信息,借此维护用户跟服务器会话中的状态。
Cookie
Cookie技术是客户端的解决方案,Cookie就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端, 然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。
客户端发送一个http请求到服务器端
服务器端发送一个http响应到客户端,其中包含Set-Cookie头部
客户端发送一个http请求到服务器端,其中包含Cookie头部
服务器端发送一个http响应到客户端
Session
Session保存在服务器上。 客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。 客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。服务器一般把Session放在内存中。 每个用户都会有一个独立的Session。Session在用户第一次访问服务器的时候自动创建, 创建Session的同时,服务器会为该Session生成唯一的session id,session id会以cookie的方式发送个客户端。客户端下次访问时,带上这个session id,就可以跟踪会话了。如果浏览器不支持cookie,可以用url重写的方式,将sessionId写入url传给服务器。
Session和Cookie的区别:
- cookie在客户端,session在服务器端
- cookie在本地,可以随便修改,session更安全
- cookie只支持ascII字符串,需要解码。session支持所有的数据类型。
- cookie存在本地,可以永久有效。而session在服务器上,设置永久有效之后,服务器上session会不断累积,会导致内存溢出。
- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用cookie。
- cookie需要浏览器支持,session不支持。
- cookie支持跨域,session不支持跨域。
- 存储量不同。