参考小林coding的图解网络,自己背了之后靠记忆整理的:图解网络介绍 | 小林coding (xiaolincoding.com)
目录
tcp/ip网络协议哪几层?
应用层 传输层 网络层 网络接口层
我们电脑或手机使用的软件都是应用层实现的,两个不同的设备等应用需要通信的时候应用层就把数据传输给下一层也就是传输层
应用层拿来实现各种应用的,传输层两个协议是tcp和udp协议 ,tcp(传输控制协议)
大部分正使用的是tcp协议,tcp比udp多了很多特性 什么流量控制 超时重传 拥塞控制等等
在tcp协议中,把每一个分块成为tcp段
还有端口,比如做项目的时候什么8080,8081,8082就是端口,80端口通常是web服务器用的,22端口是远程登录用的
网络层;最重要的是up 协议这个点,在进行设备之间的通信的时候要通过区别编码来找到想要找的这个设备,也就是通过网络号来查找设备。网络号怎么算呢?就比如192.128.120.1/24首先这个/24的意思是255.255.255.0(3组8个1->也就是24个1->11111111 11111111 11111111 0)天,跟着老师上了这么久的课到现在才知道/24是什么意思,果然全需要自己学啊,自己理解的东西才是自己的。
192.128.120.1/24和255.255.255.0两者做and运算 得192.128.120.0就是网络号
分片,就是老师上课讲的分片,去掉首部分数据部分,如果is报文大小超过1500字节就会再次进行分片,就得到一个即将发送到网络的up报文
路由器寻址工作?
路由器寻址工作和ip地址寻址不一样的,ip是根据网络号寻址
路由器是找到目标地址的子网,找到后进而把数据包转发给对应的网络内。
联系和区别?
ip协议寻址是告诉我们朝往下一个目的地是朝哪个方向走,路由器寻址是告诉我们走哪一条路径。是这个意思
画一个图
关于以太网
以太网就是在局域网内,把附近的设备连接起来,使他们之间可以进行通讯的技术
像我们电脑上的那个以太网 接口,Wi-Fi接口,以太网交换机,网线啊这些 就是以太网
提到Mac地址
以太网和ip寻址不一样,必须要通过匹配才能将数据包送达目的地。MAC地址就是干这个用的
键入网址后是怎么在界面显示出来的?
当我们输入网址,首先浏览器要先解析这个url,生成http消息,然后委托操作系统发送到web服务器
图中长长的URL实际上就是请求服务器里的文件资源
生成http请求信息
对URL进行解析之后,浏览器确定了web服务器和文件名,接下来就是根据这些信息来生成http请求信息了
但是,它是怎么委托操作系统发送到web的?——>
真实地址查询———DNS服务器
委托操作系统发送http请求信息之前,先查询服务器域名对应的ip地址
就是说你要给谁发送东西你要 找谁,得先知道他说谁,他叫什么名字,或者编号,什么什么的,确定目标才能精准发送
你想要给谁打电话,你怎么会记得住那么多电话号码,我们把电话号码和对应名字存在通讯录里面,这个dns服务器就好比通讯录 ,保存了web服务器域名与ip的对应关系
域名的层级关系
在域名中,越靠右的位置表示层级越高
其实这个网站后面有个点.———->www.server.com.
这个.是根DNS服务器,是老大!它在所有的dns服务器里面都有,所以可以根据这些dns服务器 来找到根dns服务器,就这样一步一步的推出来你想要找到的dns服务器域名
补充修改:根域的dns服务器信息保存在互联网所有的dns服务器中,任何dns服务器都可以找到并访问dns服务器了。所以客户端只要能找到任意一台dns服务器,就可以通过他找到根域dns服务器,然后顺藤摸瓜找到位于下层的某台目标dns服务器
域名解析的工作流程
大概意思就是客户端想要知道www.server.com.的ip地址,然后他去问本地dns服务器,呃应该不是直接就跑来问dns服务器的,他要先看看他自己有没有这个域名的缓存,有则返回,没有就去问操作系统,因为是委托操作系统发送的嘛,操作系统先看看自己有没有对这个域名的缓存,有则返回,没有就跑去看host文件看,没有才去问本地dns服务器——->本地dns服务器告诉客户端别来找他,给他指路去问根dns服务器去,因为他才是老大,根dns服务器说他不知道,去问老二.com去,.com说他也不知道,去问权威dns服务器.server.com去,终于问到了,并知道了www.server.com的ip地址,转身就告诉客户端他像要的ip地址
知道了他的ip地址之后,需要谁的帮助发出去呢————协议栈
通过dns获取到ip后,就可以把http的传输工作交给操作系统中的协议栈
协议栈道内部分为这几个部分,上面部分会向下面的部分委托工作,下面的部分收到任务并执行
然后接下来的就是TCP—->传输控制协议——->可靠传输
在 HTTP 传输数据之前,首先需要 TCP 建立连接,TCP 连接的建立———->三次握手
三次握手
基于客户端和服务端之间的发送和接收
大致描述一下:
刚开始的时候客户端和服务端都是关闭的,当接收到客户端键入的网址之后,服务端就开始主动监听端口,此时处于listen状态
然后客户端向服务端发送syn给服务端,此时客户端处于syn-sent状态
服务端接收成功后并向客户端发送syn+ack,此时服务端处于syn-rcvd状态
客户端接收成功后并向服务端发送ack的ack,此时客户端处于establishen状态,而服务端也处于了establishen状态
三次握手的目的就是要保证客户端和服务端都有发送和接收的能力
三次握手建立连接之后,就要开始给这个要发送的数据加包了
要委托操作系统发送http请求信息,要经历以下几个阶段
1 可靠传输———-TCP
给数据加上TCP包头
还有一个重要的是窗口大小(缓存大小)——要标示自己发送数据的速度,不能发太快
TCP要做流量控制和拥塞控制
发的太快就容易造成流量过大,太过拥塞
就联想到高速公路,什么上班早高峰这些的那种道路,只能要控制车速,不然道路上车的流量过大,太过拥塞
在tcp的帮助下,能够可靠安全的将数据发送到目的地
现在是有可靠,把握了,但是不知道要发送到哪里
2 远程定位———IP
给数据加上ip包头
ip协议里面需要有源地址和目的地址
源地址ip是客户端输出的ip地址,目的地址是本地dns服务器解析出来的web服务器的ip地址
web服务器ip地址与第一条目的子网掩码进行与运算之后的结果和第一条目的Destination比对是否一致,不一致则匹配失败,一致则匹配成功。
匹配失败的话再与第二条目的子网掩码进行与运算,得到的结果和第二条目看是否一致,一致则匹配成功,所以将使用eth1网卡的ip地址作为ip包头的源地址。
具体是看以下图:
通过ip给数据指定要发送到哪里之后,目的地太远了,数据并不知道下一站要到哪里
3 两点传输———MAC
给数据加上MAC包头
MAC是以太网使用的头部,它包含了接收方和发送方 的MAC地址等信息
在MAC包头里需要发送方MAc地址和接收方MAC地址,用于两点之间的传输
要清楚这个包要加给哪个数据的头上,即要知道对方的Mac地址,怎么找到你想要找的那个Mac 地址呢,喊啊
就是进行广播,告诉所有人我在找ip为xxxxx的那个,让他听到了自己来告诉我他的Mac 地址是什么,然后给他加上Mac包头
终于加完了包,来到门口准备出门了
4 门口———-网卡
将包转换成电信号,通过网线发送出去
5 送别者————-交换机
当电信号来到网线接口时,交换机就将电信号转换成数字信号,发送到目的地
交换机工作在MAC层,也就是二级网络层
交换机的端口没有MAC地址
交换机根据MAC地址表查找MAC地址,然后将信号发送到相应的端口
只有相应的接收者才接收包,而其他设备会忽略这个包
以下两个属于广播地址
MAC地址:FF:FF:FF:FF:FF:FF
Ip地址中的255.255.255.255
网卡有MAC地址,交换机没有MAC地址
6 出境大门———路由器
路由器与交换机的区别,工作原理和交换机相似,也是通过查表来判断包转发的目标
区别:
路由器是基于ip设计的,俗称三层网络地址,路由器的各个端口都有ip地址和MAC地址
交换机是基于以太网设计的,俗称二层网络设备,交换机的端口没有MAC地址
路由器基本原理:
路由器的端口具有MAC地址,因此能够成为以太网的发送方和接收方,同时还具有ip地址
电信号到达网线接口部分,路由器中的模块会将电信号转成数字信号
然后通过包末尾的FCS进行错误校验
当MAC头部将数据包送达路由器时,MAC地址的任务就完成了,MAC头部则被丢弃
转发操作分为几个阶段,首先是查询路由表判断转发目标 (和交换机一样)
路由器工作流程和上面交换机一样的
web服务器ip地址与第一条目的子网掩码进行与运算之后的结果和第一条目的Destination比对是否一致,不一致则匹配失败,一致则匹配成功。
匹配失败的话再与第二条目的子网掩码进行与运算,得到的结果和第二条目看是否一致,一致则匹配成功,所以将使用eth1网卡的ip地址作为ip包头的源地址。
实在找不到匹配路由时就会选择默认路由,路由表中子网掩码为0.0.0.0
大致描述和上面的默认网关差不多,一个是默认网关一个是默认路由
在网络包传输的过程中,源ip和目标ip始终是不会变的,一直变化的是MAC地址
当小弟http数据包终于在路上遇到的各路大侠的加包和帮助下来到了城门口,守门的路由器知道数据包原来是要进城门找城里的人后并开门放他进城,这时交换机将他送达目的地。
7 服务器与客户端之间的互相扒皮
网络模型
OSI网络模型 开放式系统互联通信参考模型
该模型七层:(从下到上)物理层,数据链路层,网络层,传输层,会话层,表示层,应用层
TCP/IP模型
四层(从上到下其实就是把物理层,数据链路层合并为网络接口层,会话层,表示层,应用层合并为应用层)网络接口层(负责网络包在物理网络报中的传输),网络层(负责网络包的封装,分片,路由,转发,比如IP,ICMP),传输层(负责端到端的通信 比如TCP,UDP),应用层(负责向应用提供应用程序)
Linux网络协议栈
可以把身体比作数据包,给他套一件打底服就是传输层中的TCP头,再套一件外套就是网络层中的IP头,帽子和鞋子比作网络接口层的帧头和帧尾
额描述一下脑子里的这张图:
从上到下
应用层 应用数据
传输层 应用数据 TCP头
网络层 应用数据 TCP头 IP头
网络接口层 帧头 应用数据 TCP头 IP头 帧尾
http常见面试题
http是什么?
超文本传输协议
我的理解:http是在一个计算机世界中专门在两点之间传输文字 图片 音频 视频等的超文本数据的约定和规范
GET和POST有什么区别?
GET 获取 语义是从服务器获取指定的资源,
POST 新增 发送 语义是根据请求负荷(报文body)对指定的资源做出处理
GET 和POST方法都是安全和幂等的吗
GET安全且幂等
POST 不安全 不幂等
HTTP缓存技术
强制缓存和协商缓存
强制缓存(强制的)
协商缓存(协商后的)
就是与服务端协商之后,通过协商结果来判断是否使用本地缓存。
http特性:
http/1.1优点:简单 灵活 易于扩展 应用广泛和跨平台
缺点:无状态双刃剑 明文传输双刃剑(信息暴露容易背窃取信息) 不安全
不安全包括这三部分:
通信使用明文(不加密),内容可能会被窃听(账号容易被盗)。不验证通信方的身份,遭遇伪装(假冒的淘宝 pdd 钱容易没)
无法证明报文的完整性 可能遭遇篡改 (网页上植入垃圾广告)
针对这三个不安全问题 https(就是在http的三次握手的基础上加上ssl/tsl)的连接
http超文本 传输协议 信息是明文传输
https则解决了不安全的缺陷 在tcp和http网络层之间加入了ssl/tls协议
https解决了哪些问题
窃听风险
篡改风险
冒充风险(这三和上面一样)
https在http和tcp之间加入了ssl/tls协议 可以解决:
信息加密(交互信息无法被窃取)自己忘记账号密码没办法
校验机制(无法篡改通信信息)自己要去搜垃圾广告也没办法
身份证书(证明淘宝是真的淘宝) 自己不省钱没办法
https是如何解决上面三个问题的
混合加密 (非对称和对称加密结合)
摘要算法(为保证传输的内容不被篡改,要对内容计算出一个指纹,然后同内容一起传输给对方,对方收到后,先是对内容计算出一个指纹,然后哥发送的指纹做比较,相同则没被篡改,不相同则被篡改)
数字证书
(公钥加密,私钥解密 保证内容传输的安全;【私钥加密 公钥解密。保证消息不回被冒充我们常说的数字签名算法就是用的这种方式】)
为什么需要tcp协议,工作在哪一层?
工作在传输层啊
传输控制协议
可靠传输
tcp是一个工作在传输层的可靠数据传输的服务
能确保接收端接收的网络包是无损坏,无间隔,非冗余,按序的
什么是tcp?
tcp是面向连接,可靠,基于字节流的 传输层 通信协议
什么是tcp连接 ?
简单说就是用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合包括socket,序列号和窗口大小称为连接
socket:由ip地址和端口号组成
序列号:拿来解决乱序问题的,给他们排序 的就是序列号
窗口大小:控制流量和拥塞控制的
如何唯一确定一个tcp连接呢
源地址 源端口 目的地址 目的端口
tcp和udp区别?
tcp面向连接,且一对一,在http请求数据前都要建立连接,udp不用,且一对多,直接进行数据的传输
tcp可靠,能保证数据安全抵达目的地,确保接收端接收的数据网络包是无损坏 无间隔 非冗余 按序的
udp尽最大努力交付
tcp有拥塞控制和流量控制
udp即使网络再堵都影响不到他
后续的补充:
首部开销 :tcp首部长度较长,有一定的开销
udp首部只有8个字节,并且固定不变开销小
传输方式:tcp是流式传输 udp一个包一个包发送
分片也不同
应用场景:
tcp用于http/https可靠性交付嘛
udp面向无连接 随时发送,简单高效
什么dns,视频音频这些
tcp和udp可以使用同一个端口吗
可以
为什么是三次握手而不是两次四次
首先,三次握手是为了保证双方有接收和发送能力,在前面背过
然后:
1 为了防止历史连接初始化连接
什么意思呢?就是刚开始客户端向服务端发送syn=90,然后因为网络阻塞,客户端宕机了,重新发了一个syn=100的,然后旧的syn先到达服务端的,服务端返回syn+ack
也就是90+1,但是客户端期待收到的是100+1,好好好,客户端给服务端发送了RST,终端连接后,syn=100终于到达服务端,服务端重新发送100+1给客户端,收到后将ack的ack返回给服务端
如果是两次握手肯定不行,服务端都establishend了,返回给客户端100+1之后,客户端也establishend了,怎么把ack的ack返回给服务端
我的理解就这样
四次也不行,三次就能完成的事情为什么还要再多来一次,多浪费资源啊
为什么每次建立TCP连接时,初始化的序列号都要求不一样呢
主要原因:(记得就行)
为了防止历史报文被下一个相同四元组的连接接收
为了安全性,防止黑客伪造的相同序列号的TCP报文被对方接收
既然IP层会分片,为什么TCP层还需要MSS呢
MTU:一个网络包的最大长度
MSS:除去IP和TCP头部之后,一个网络包所能容纳的TCP数据的最大长度
第一次握手丢失了会发生什么呢
第二次握手丢失呢
第三次
什么是SYN攻击,如何避免SYN攻击?
SYN攻击就是第一次第二次握手中,客户端给服务端发送SYN,服务端收到了返回给客户端SYN+ACK,但是客户端一直没有收到,客户端一直在给服务端发SYN,服务端一直在给客户端发SYN+ACK,然后就使得TCP半连接队列爆满了
什么是 半连接队列什么是全连接队列
那如何避免SYN攻击呢
针对性回答,首先想到,增大TCP半连接队列,不至于那么容易就爆满
其次想到,减少SYN+ACK重传次数,不能让他一直在重传吧,再一直不停的发迟早会爆满的,这个是可以设置的
然后:增大netdev_max_backlog,这个自己去设置
开启tcp_syncookies可以在不使用SYN半连接队列的情况下成功建立连接,相当于绕过SYN半连接来建立连接
服务器出现大量TIME_WAIT状态的原因有哪些?
什么场景下服务端会主动断开连接呢?
第一个场景:http没有使用长连接
二:http长连接超时
三:http长连接的请求数量达到上限
IP基础知识
ip在TCP/IP参考模型中处于第三层,网络层
网络层的主要作用是:实现主机和主机之间的通信,也叫点对点通信
ip的作用是主机之间通信用的
MAC的作用是实现直连的两个设备之间通信,
ip负责没有直连的两个网络之间进行通信传输
只有两者兼备,既有某个区间的车票又有整个旅行的行程表,才能保证目的
在网络中数据包传输中也是如此,源ip地址和目的ip地址在传输过程中是 不会变化的,(前提没有使用NAT网络)
只有源MAC地址和目标MAC一直在变化)
ping的工作原理:
ICMP全称Internet Control Message Protocol 互联网控制报文协议
ICMP功能:
确认IP是否成功送达目标地址,报告 发送过程中 ip包被废弃的原因 和 改善网络设置等