计算机网络复习

计算机网络
分层
OSI七层参考模型
物理层:通过光缆,电缆进行01信号传输
数据链路层:单独的0/1信号没有意义,通过以太网协议对0/1信号分组,一组电信号称为一个数据包,表头包含发送者和接收者的mac地址,可以通过广播在同一子网发送接受数据。
网络层:通过引入ip地址,可以子网掩码区分不同计算机是否属于同一个子网络。同一子网络通过广播方式发送,非同一网络就通过路由方式发送。(相关协议:IP、ARP(地址解析协议,根据IP地址获取mac地址)、NAT(网络地址转换协议,将在本地网络中使用的私有地址,在连接互联网的同时转换成为公共 IP 地址的技术)、ICMP协议(ping发送的包就是ICMP应答报文,用于测试网络是否畅通))
传输层:解决端口到端口的通信;(相关协议: TCP、UDP)
会话层:管理不同进程之间的通信,如不同软件数据分发给不同软件。
表示层:提供数据处理功能(如压缩加密等)
应用层:为应用进程提供服务(如解析数据)(相关协议:HTTP(网络通信协议)、DNS(根据域名找ip)、DHCP(分配IP地址和相关的网络参数。)、SSH(安全通信协议)、FTP(文件传输协议)、SMTP和IMAP(SMTP 协议只负责邮件的发送,POP3/IMAP负责邮件接收)
五层模型
相对七层,将会话层和表示层融入到应用层(如https涉及加密等,这个需要在表示层的权限,所以将会话层和表示层合并到应用层,这样程序员就能实现相应功能)
TCP/IP四层模型(tcp/ip协议)
相对五层,把物理层和数据链路层合并为网络接口层
上网过程
前提
通过DHCP协议获取四个参数(本机IP地址、子网掩码、网关的IP地址、DNS的IP地址)
访问一个网页的全过程
客户端输入网址——获得目标IP(缓存没有就通过DNS解析)——三次握手来建立TCP连接——发送与接收数据(通过http访问网页)——最后通过四次挥手来断开TCP连接
HTTP访问:应用层向域名发送一个HTTP请求报文
传输层通过TCP协议将HTTP请求报文按序号分割成多个报文段
网络层通过IP协议当判断是否同一子网。
1. 同一子网通过arp协议获取目标mac地址,然后再发送。
2. 不同子网就把目标mac地址改为网关的mac地址,网关收到后根据路由表找到数据包对应的子网(对应子网通过arp协议获取目标mac),最后通过对应子网发送数据包给目标主机
目标机收到数据后:传输层通过TCP协议重装报文段
应用层通过HTTP协议对请求内容进行处理(回传也类似)
报文传输过程
http报文 分割成多个 报文段,传输层通过tcp组装成一个个tcp报文(包含端口等信息),网络层加上ip后就变成一个个数据包。
网络层和数据链路层
交换机:
作用:交换机中有一张端口和mac地址的映射表。交换机根据数据包中的目标mac地址发送给对应端口的计算机(计算机通过网线连接到交换机的某个端口上,这里端口指的是交换机上的端口)
流程:当交换机收到一个数据包后,会先把源mac与接收端口绑定,然后根据目标mac查找发出端口(没找到就进行泛洪:向除接收端口外其他端口发送。)
网关:
负责不同子网的通信,为每个数据包寻找一条最佳传输路径,其中路由表中记录了ip和对应子网掩码长度,和下一跳地址(还有一起其他信息)(路由器担任网关的角色,负责路由的功能)
地址转换技术(NAT)
源地址转换技术(SNAT):根据内网源ip和端口 转换为公网ip地址。(使用场景:增加ip地址,如不同家庭网络中可以使用相同ip)
目标地址转换技术(DNAT):如内网提供一个web服务,可以配置映射(公网端口和内网ip+端口的映射),访问公网某个端口时,将目标ip和端口根据映射进行修改。
网络地址和广播地址
主机位全0为网络地址(识别网络ID用的 如192.168.1.0 说明该网段属于192.168.1的段),全1为广播地址(负责广播)。所以192.168.1.0/24 包含最大主机数为2^8 - 2 = 254 
传输层相关
三次握手
过程
第一次握手:客户端向服务器发送SYN报文,并指明初始化序列号(此时处于 SYN_Send 状态)
第二次握手:服务器收到 SYN 报文之后,会以自己的 SYN 报文作为应答,并指明自己的初始化序列号 ,同时会把客户端的序列号 + 1 作为 ACK 的值,表示自己已经收到了客户端的 SYN(此时服务器处于 SYN_RCVD 的状态)
第三次握手:客户端收到 SYN 报文之后,会发送一个 ACK 报文(ACK值为服务器的序列号 + 1 ),表示已经收到了服务端的 SYN 报文,此时客户端处于 established 状态。
最后:服务器收到 ACK 报文之后,也处于 established 状态,此时,双方以建立起了链接
三次握手作用
1. 确认双方的接受发送能力是否正常。2、指定自己的初始化序列号,为后面的可靠传送做准备。(初始化序列号是动态生成的,如果固定容易被攻击)
什么是半连接队列
服务器第一次收到客户端的 SYN报文后,服务器会把此种没有完全建立的连接放在半连接队列。已经完成三次握手会放在全连接队列中。(如果队列满了就有可能会出现丢包现象。)
三次握手可以携带数据吗
前两次不可以(攻击者可以第一次握手时携带大量数据,重复发送大量syn报文,导致服务器出现问题),第三次可以(第三次客户端以已建立连接)
四次挥手
过程
第一次挥手:客户端发送一个FIN报文,报文中会指定一个序列号。此时客户端处于FIN_WAIT1状态。
第二次挥手:服务端收到FIN报文后,会发送ACK报文(且把客户端的序列号值+1作为ACK报文的序列号值)表明已经收到客户端的报文了,此时服务端处于CLOSE_WAIT状态。
第三次挥手:如果服务端也想断开连接了,发给FIN报文,且指定一个序列号。此时服务端处于LAST_ACK的状态。
第四次挥手:客户端收到FIN报文后,一样发送一个ACK报文作为应答(且把服务端的序列号值+1作为自己ACK报文的序列号值),此时客户端处于TIME_WAIT状态(持续2MSL)。需要过一阵子以确保服务端收到自己的ACK报文之后才会进入CLOSED状态
最后:服务端收到ACK报文之后,就处于关闭连接CLOSED状态。
为什么需要四次
第二次挥手是告诉客户端已经收到关闭请求,你不要再发送数据了,但此时服务器可能还没完全接收数据,所以需要接收完后再通过第三次握手发送关闭请求。
为什么需要timeWait
最后一个 ack报文 ,有可能丢失,这时服务器会重新发fin报文, 如果这时主动方处于 关闭状态 ,就会响应 rst(异常的关闭连接) 而不是 ack。
TCP和UDP区别
TCP: 面向连接,可靠,效率慢,所需资源多。(如:文件传输等)
UDP:面向无连接,不可靠,效率高,所需资源少(如:qq语音,直播等)
TCP 协议如何保证可靠传输
滑动窗口负责数据的可靠传输
把要发送的数据分为4各部分,分为已发送并确认,已发送未确认,即将发送,等待发送。发送窗口由已经发送未确认和即将发送组成,当收到ACK确认后,窗口收缩,当窗口大于容纳数据时就会进行窗口扩张。
丢包、乱序、重传解决:一个数据包 包含起始序列号,长度,数据内容(数据包里可以包含多个字节),收到数据后回复ack(下一包的起始序列号)和接收窗口大小(根据网络情况调节 )。最后接收端组装,丢失的进行重传,或者发送端长时间没收到ack也会进行超时重传。
流量控制:协调端到端的数据传输接收能力(通过滑动窗口实现,让发送方发送速率不要太快,接收端好接收。通过接收方回复确认的时候会发送接收窗口大小来实现)
拥塞控制
避免发送方注入到网络过多的数据, 防止网络负载过大(具体实现:发送方维护一个拥塞窗口(也就是发送窗口),一开始发送方发送一个字节,在收到接收方的确认后,拥塞窗口就呈指数增加(慢开始算法),当拥塞窗口超过慢开始阈值的时候,拥塞窗口就呈线性增加(拥塞避免算法),直到出现超时后,把慢开始阈值设置为出现拥塞时拥塞窗口的一半,再重复慢开始的操作)
快重传和快恢复:当收到3个对同一个报文段的重复确认,就代表数据丢失,慢开始阈值降为当前窗口一半,窗口不重新慢开始,而是直接从阈值处线性增加。
超时重传(ARQ 协议):  
停止等待 ARQ 协议:每发完一个分组就等待,在规定时间内没收到确认就重发。(信道利用率低,等待时间长)
连续 ARQ 协议:发送方维持一个发送窗口,凡位于发送窗口内的分组可以连续发送出去,不需要等待对方确认。接收方收到窗口所有数据后再确认(接收端组装,丢失的进行重传)
校验和: TCP 数据包中有校验和字段,接收端可以根据它来确认数据包是否有损坏,损坏则丢弃
有序编号:每个tcp数据包都有编号,接收端可以把数据有序的组装。
tcp粘包
tcp粘包定义
我们发送的数据是一个个数据包,但tcp是以流的方式传输,所以接收端可能同时接受到多个数据包,造成粘包的现象。
如何解决tcp粘包
使用标准的应用层协议(如http,https)来封装传输的数据包,然后接收端根据协议的规则来解析。
数据包尾部添加特殊字符,缺点是每个字符都要判断是否为特殊字符,效率低。
数据包头部添加数据头,数据头中包含了数据长度。(如果数据类型复杂,怎样获得数据长度?通过把数据序列化,到接收端再反序列化即可(如通过Json序列化和反序列化))
UDP会产生粘包吗
UDP 是基于数据报的传输协议,一次发送一个报文,不会有粘包问题。(数据包太长,需要分片,那也是应用层的事情)
怎样判断接收方接收到多少数据(重传)
如发送方发送了1-100的数据包,接收端接收到数据后回复ack(100+1)以及数据窗口为50。发送方收到ACK报文后,就知道接收端收到后两个,重传前三个
应用层相关
b/s和c/s架构
c/s架构
客户端/服务器架构,缺点就是相对不好维护
b/s架构
浏览器/服务器架构,缺点就是安全性相对不好控制
http
http版本
HTTP/1.0
浏览器与服务器只保持短暂的TCP连接,请求处理完成后立即断开连接,速度慢(TCP连接的建立需要三次握手)。
HTTP/1.1
1. 连接复用,就是TCP连接默认不关闭,可以被多个请求复用。2. 引入了管道机制(半双工),即在同一个TCP连接里面,客户端可以同时发送多个请求,但是服务端还是顺序执行的。
TPC连接关闭情况:1. 主动通知关闭时。2. 浏览器关闭时。3. 浏览器通过TCP保活功能检测服务端长时间无响应时。4.服务器判断客户端长时间未操作时 。
扩展:TCP保活功能(TCP Keep-Alive):每隔一段时间发送一个消息,判断对方是否还存在,属于传输层的概念,主要用来检测并关闭异常连接。(心跳检测:应用层实现的TCP保活功能,应用层下更灵活)
HTTP/2 :采用了多路复用,相当于全双工,就是在一个TCP连接里,客户端和浏览器都可以同时发送多个请求或响应,而且不用按照顺序执行(最后组装)。
http和https区别
http
超文本传输协议,默认80端口,http协议是无状态的(每个请求独立,互不影响)
https
在http基础上引入一个加密层,数据会加密传输。默认443端口。
CA证书作用:恶意拦截请求,伪装身份(通过ca证书就可以解决,就可以判断公钥是否合法)
http和https工作流程
http工作流程
客户端输入网址——DNS解析域名为ip——建立TCP连接——客户端发送请求——服务器响应——断开TCP连接
https工作流程
步骤跟http不同的就是再请求响应阶段
https(SSL协议):采用非对称加密。
具体过程:客户端请求公钥——服务器返回公钥——客户端使用公钥将明文加密为密文,再发送密文——服务器通过私钥解密
缺点:非对称加密速度慢,效率低(特别当内容很多的时候)。
https(TSL1.0协议)采用混合加密(非对称加密+对称加密)
具体过程:客户端请求公钥——服务器返回公钥——客户端用公钥对随机Key加密,发送加密后的随机Key——服务器通过私钥解密得到随机Key——客户端结合随机Key和明文对称加密,然后发送——服务器结合随机Key对称解密。
因为RandKey很小,所以不会很慢,内容很大,采用对称加密很快,平衡了两种加密方法优缺点。
http报文
http请求报文组成(响应报文类似)
请求行
请求行由  请求方式(GET、POST、DELETE等)、URL和HTTP协议版本3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1。
请求头部
请求头部由键值对组成。用于通知服务器有关于客户端请求的信息(如:User-Agent:客户端浏览器类型。Host:请求的主机名。请求数据类型、长度等)
空行
表示以下不再有请求头。(发送回车符和换行符)
请求数据(get没有)
包含post表单数据 
http常见状态码
1开头(信息类)
100,接受的请求正在处理,信息类状态码
2开头(成功类)
2xx(成功)表示成功处理了请求的状态码
200(成功)服务器已成功处理了请求。
3开头(重定向,需要进一步操作)
301,永久性重定向,表示资源已被分配了新的 URL
302,临时性重定向,表示资源临时被分配了新的 URL
303,表示资源存在另一个用GET方法获取资源的URL
304,浏览器有对应页面的缓存,浏览器从缓存中获取内容
304涉及页面缓存
对于一些静态资源,浏览器一般会做缓存,客户端在请求文件的时候,请求中会包含If Modified Since(这是个时间)这个时间之后如果文件发生了修改才返回200和具体文件内容,否则返回304.
对于动态资源,浏览器一般不会缓存
或者把页面放到静态资源中,利用动静分离,每次只请求数据部分,然后渲染到静态页面上
如何需要缓存整个动态页面(不经常更改的):我们可以在Response的HTTP的header中添加一个last Modified 的定义(静态资源默认会有,所以会缓存),添加后浏览器就会对页面进行缓存。动态页面请求时,在判断文件是否修改还是会查数据库,但如果没有修改的话,就不用返回页面的内容,只是返回一个304(HTTP header),从而减少带宽
4开头(客户端错误)
400:请求的语法错误
401:请求需要身份认证(比如访问需要登录的页面)
403(禁止)服务器拒绝请求
404(未找到)服务器找不到请求资源
5开头(服务器错误)
500,(服务器内部错误)服务器遇到错误,无法完成请求
503,表示服务器处于停机维护或超负载,无法处理请求
post和get区别
定义:get 和 post请求是http协议中的两种请求方式。get一般般用来获取信息的。post一般是用来更新信息。
参数:get参数在地址栏,安全性低,长度限制2048字符。  post传递参数放在请求报文的请求数据中,安全性高,参数长度没限制(参数类型:get只接受ASCII字符,而post没有限制。)
是否被缓存:get请求可以被缓存, post请求不会被缓存(所以get请求刷新浏览器或者回退没有影响,post请求则会重新请求一遍)
产生数据包:get产生一个tcp数据包,post两个tcp数据包(一个包用于检查服务器端是否正常,正常再发送携带数据的包)
Cookie和Session
为什么需要:由于HTTP协议无状态,例如对于一些场景下,并不知道是哪个用户在执行操作,这时就需要session或者Cookie
Session:保存在服务端的,相对安全,Session存储内容太多会影响服务器性能。Session访问后会刷新生命周期
Cookie:保存在客户端的,相对不安全,单个Cookie数据量不超过4k,Cookie生命周期是累计的(到时间就过期)
URI 和 URL 的区别是什么?
URI统一资源标志符,可以唯一标识一个资源
URL统一资源定位符(更具体的URI),它不仅唯一标识资源,而且还提供了定位该资源的信息。
当我们ping的时候发送的是什么包
ping发送的是ICMP 应答报文,用于测试网络是否畅通
五层协议具体
实体层
作用:把电脑连起来的物理手段,负责传送0/1信号(光缆,电缆,无线电波等)
链路层
引入:单独的0/1信号没有意义,必须对它进行解读,引入链路层。
作用:确定0/1分组方式(以太网协议 为主),通过广播在同一子网发送接受数据。
以太网协议:一组电信号构成一个数据包,叫做帧,分为表头和数据两部分 (表头内容包括发送者MAC地址,接收者MAC地址,数据类型等。)表头长度固定,数据长度有一个范围,所以如果数据过长,需要分成多个帧。
mac地址:发送者和接收者为mac地址(每块网卡出厂都有一个独一无二的48位二进制的MAC地址)
广播:向本网络所有设备都发送数据包。当设备接收到数据包时,取出其接收方的mac地址与自身mac地址作比较,相同就接收,否则就丢弃。
获取mac地址:
同一子网获取MAC地址通过ARP协议:通过广播的方式,利用目标IP地址,找到其MAC地址。
不同子网获取MAC地址:把数据包先传送到两个子网络连接处的网关,让网关处理。所以这里就需要知道网关的Mac地址,网关的Mac地址可根据ARP协议获得。 
网络层
引入:由于链路层只能在同一子网进行数据传输,所以引入网络层
作用:通过引进一套新的地址,我们能够区分不同的计算机是否属于同一个子网络。同一子网络通过广播方式发送,非同一网络就通过路由方式发送。
IP协议:网络地址的协议,叫做IP协议,分为IPv4(32位) 和 IPv6(64位),前部分为网络位,后部分为主机位,通过子网掩码确定网络位,同一子网网络位相同。
子网掩码:形式上等同于IPv4地址,32位,网络位为1,主机位为0。如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。
判断是否同一子网:将两个IP地址与其对应的子网掩码进行AND运算,得到网络地址,然后比较网络地址是否相同,相同就在同一网络,或则就不在同一网络。
IP数据包:包含标头和数据两部分,表头包含发送方,接收方的ip地址等
传输层
引入:有了网络层,已经可以实现互联网上任意主机间的通行,但一台电脑上有若干程序,如QQ间的通信,所以还需要解决端到端的通信 ,所以产生了传输层。
作用:解决端口到端口的通信
端口:16位(0——65535之间的一个整数)0——1023端口一般被系统占用,用户可选择1024——65535的端口。
套接字:Unix 系统把 主机+端口 称为“套接字”,有了套接字,就可以进行网络应用程序开发了。
UDP数据包:由"标头"和"数据"两部分组成,"标头"部分主要定义了发出端口和接收端口
TCP协议:UDP协议优点是比较简单,容易实现,缺点就是可靠性能差,因为数据包发送后,无法知道对方是否收到。所以就诞生了TCP协议。TCP协议规定每个数据包发送后都要求确认,若未收到确认,即代表数据包遗失,则重新发送数据包。TCP协议的优点就是很可靠,缺点就是过程复杂,实现困难,消耗较多的资源。
应用层
引入:端到端可以进行数据传送,但各种应用程序数据格式不同,需要对其进行解读,所以引入应用层
作用:规定应用程序的数据格式,以便各种应用程序对传输层的数据进行解读。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值