计算机网络知识汇总
计算机网络
OSI七层模型和TCP/IP四层模型
每一层负责的职能都不同,如下:
- 应用层: 负责给应用程序提供统一的接口;
- 表示层:负责把数据转换成兼容另一个系统能识别的格式
- 会话层:负责建立,管理和终止表示层实体之间的通信会话
- 传输层:负责端到端的数据传输
- 网络层:负责数据的路由,转发,分片
- 数据链路层:负责数据的封帧和差错检测,以及MAC寻址
- 物理层:负责在物理网络中传输数据帧
TCP/IP模型
- 应用层支持HTTP,SMTP等最终用户进程
- 传输层处理主机到主机的通信(TCP,UDP)
- 网络层寻址和路由数据包(IP协议)
- 链路层通过网络的物理电线,电缆或无线信道移动比特
TCP在传输层
IP在网络层
应用层
HTTP协议
应用层有哪些协议?
HTTP,HTTPS,CDN,DNS,FTP都是应用层协议
HTTP报文有哪些部分?
分请求报文和响应报文来说明
请求报文:
- 请求行:包含请求方法,请求目标(URL或URI)和HTTP协议版本
- 请求头部:包含关于请求的附加信息,如Host,User-Agent,Content-Type等
- 空行: 请求头部和请求体之间用空行分割
- 请求体: 可选,包含请求的数据,通常用于POST请求等需要传输数据的情况
响应报文:
- 状态行: 包含HTTP协议版本,状态码和状态信息
- 响应头部: 包含关于响应的附加信息,如Content-Type,Content-Length等
- 空行: 响应头部和响应体之间用空行分割
- 响应体: 包含响应的数据,通常是服务器返回的HTML,JSON等内容
HTTP常用的方法
HTTP中最常用的方法是GET方法和POST方法,除此之外还有一些其他方法
GET一般用于获取/查询资源信息,而POST一般用于更新资源信息
GET和POST方法的区别
- 使用GET方法可以收藏为书签,可以被缓存,参数保留在历史记录中;而POST方法这些都不行
- 对数据长度的限制:GET方法对数据长度有限制,因为GET方法是在URL中添加数据,而URL的最大长度是2048;POST方法则是无限制的
- 对数据类型的限制: GET方法只允许ASCII字符;POST方法无限制,也允许二进制数据
- 安全性: GET方法的安全性能较差,因为发送的数据是URL的一部分,而POST方法传输数据的时候,请求数据可以放在请求正文里面
- 可见性: GET方法数据在URL中,对所有人都是可见的;而POST方法数据不会显式在URL中
PUT和POST方法的区别?
PUT和POST方法都有更改指定URI的语意,但是POST如果执行多次,产生的效果是一样的;
PUT请求: 如果两个请求相同,第二个请求会把第一个请求覆盖掉;(所以PUT用来改资源)
POST请求: 后一个请求不会把第一个请求覆盖掉;(所以POST用来增资源)
状态码
常用的具体状态码有:
- 200: 请求成功
- 301: 永久重定向;302: 临时重定向
- 404: 无法找到此页面;405: 请求的方法类型不支持;
- 500: 服务器内部错误
Servlet
-
什么是Servlet
- Servlet是用来处理客户端请求并产生动态网页内容的Java类
-
Servlet的生命周期
- 初始化–服务–销毁
- init(): 在第一次创建Servlet时被调用,在Servlet生命周期,仅执行一次init()方法,负责初始化Servlet对象
- service(): 每当请求一个HTTPServlet对象的时候,该对象的Service()方法就要调用,一般只重写doPost/doGET类似的方法
- destroy(): 仅执行一次,在服务端停止且卸载Servlet的时候执行该方法,当Servlet对象退出生命周期的时候,负责释放占用的资源
- 初始化–服务–销毁
-
Servlet和Tomcat是怎么工作的
-
WebClient向Servlet容器(Tomcat)发出Http请求;
-
Tomcat接收Web Client的请求;
-
Tomcat创建一个HttpRequest对象,将Web Client请求的信息封装到这个对象里
-
Tomcat创建一个HttpResponse对象;
-
Tomcat调用HttpServlet对象的service方法,把HttpRequest对象和HttpResponse对象传给HttpServlet对象;
-
HTTPServlet调用HttpServletRequest对象的方法,获取Http请求信息;
-
HttpServlet调用HttpServletResponse对象的方法,生成响应数据;
-
Tomcat把HttpServlet的响应结果传给Web Client
-
Session和Cookie
-
Session
指的是Web系统的会话,指用户登录以后,在退出之前都是一个会话.Session的作用就是:用户登录的时候,服务器保存用户的身份信息(Map<value, session>), 在之后访问敏感资源的时候,通过请求key = value, 服务端通过key对应到value,然后在map中获取到用户的身份信息
-
Cookie
实际上就是一小段文本信息,原理是: 客户端本地保存用户的身份信息;使用场景: 登录页面内的多少天免登录/记住密码等
Cookie
HTTP协议是无状态的协议,一旦数据交换结束,客户端和服务器的连接就会关闭,HTTP协议对之前处理的事务没有记忆(比如用户A在逛淘宝,把一个东西加入了购物车,当他再次逛淘宝想把另外一个东西加入购物车的时候,服务器无法判断该放到哪个用户的购物车里);而Cookie就是为了弥补HTTP协议无状态这一不足出现的机制
Cookie通过给客户端们发一个通行证,每个人访问的时候都必须带上自己的通行证,这样颁发一个服务器就能从通行证上确认客户身份了
Cookie本质上就是一段文本信息.客户端请求服务器的时候,如果服务器需要记录该用户,就用response向客户端颁发一个Cookie.客户端会把Cookie保存起来,当再次访问请求这个服务器的时候,客户端把请求的URI和Cookie一起发给服务器,服务器检查Cookie,以此来辨别用户状态
Session
Session是服务器端使用的一种记录客户端状态的机制,在客户端访问服务器的时候,服务器会开辟一块内存空间,把客户端信息以某种形式(Session对象)记录在服务器上使用,存储结构为ConcurrentHashMap,再次访问的时候只需要从该Session中查找用户信息就行;
Session相比Cookie简单一些,但是也增加了服务器的存储压力;
如果说Cookie机制是通过颁发通行证,检查通行证来确认用户身份的话,那么Session就是通过给用户建立一个档案,查询档案来确认用户身份。
一般为了保证更高的存取速度,服务器把Session放在服务器内存中,每个用户都会有一个独立的Session;为了防止内存溢出,服务器会把长时间没有活跃的Session从内存中删除,这个长时间就是Session的超时时间
Session实现登录就是:用户登录的时候,服务器保存用户的身份信息(Map<value, session>),在之后访问敏感资源的时候,通过请求key = value,服务端通过key对应到value,然后在map中获取到用户的身份信息
Session和Cookie怎么联系起来
服务器第一次收到请求后,开辟一块Session空间(创建Session对象),同时生成一个Session id,并通过响应头中的Set-Cookie:JSESSIONID=xxxxxxx 命令,向客户端要求设置Cookie,客户端收到响应后,在本机客户端设置一个JSESSIONID=xxxxxxx的Cookie信息,这个Cookie的结束时间为这次会话结束;接下来客户端每次向同一个服务器发送请求的时候,请求头里都会带上该cookie信息,然后,服务器通过读取请求头中的Cookie信息,获取JSESSIONID的值,得到本次请求的Session id
注意:服务器只会在第一次客户端请求的响应中,在响应头上加上Set-Cookie: JSESSIONID=xxxxxxx 信息,接下来同一个会话的响应中,不再添加;而客户端必须在每次请求头中带上Cookie:JSESSIONID=xxxxxxx 信息
HTTP和HTTPS
HTTP协议运行在TCP上,使用明文传输,客户端和服务端都无法验证对方的身份;
HTTPS是身披着SSL外壳的HTTP,运行在SSL上,SSL运行于TCP上,是添加了加密和认证机制的HTTP
HTTP协议的特点
- 支持服务器/客户端模式
- 简单快捷: 客户端向服务器发送请求时,只需要传输请求方法和路径
- 灵活: HTTP允许传输任意类型的数据对象
- 无连接: 无连接的含义是每次连接只能处理一个请求.服务器处理完客户端的请求,并收到客户端的响应之后,就断开连接
- 无状态: 无状态指协议本身对事务处理没有记忆能力.缺少状态意味着如果后续处理需要前面的信息,必须重传,这会导致每次连接传输的数据增大,但如果服务器不需要先前的信息时,它的应答就很快
HTTP和HTTPS的区别
- HTTP是以
http://
开头的;而HTTPS是以https://
开头的 - HTTP是不安全的,信息是明文传输的;HTTPS是安全的,具有安全性的SSL加密传输
- HTTP标准端口是80;HTTPS标准端口是443
- 在OSI模型中,HTTP工作于应用层,HTTPS工作于传输层
- HTTP无需加密,无需证书;HTTPS对传输的数据需要进行加密,也需要认证证书,会消耗更多的CPU资源
传输层
什么是五元组
源IP,源端口号,目的IP,目的端口号,协议号
怎么查看某个端口
- 在Windows中: netstat -ano | findstr “想要查询的端口号”
- 在Linux中: netstat -anp | grep “想要查询的端口号”
UDP协议
特点:
- 无连接: 在传输之前不需要建立连接,知道IP和端口号就直接传输
- 不可靠: 没有确认应答和重传机制,如果发生网络故障等原因导致该段数据无法发送到对方,UDP也不会给应用层返回任何错误信息;
- 面向数据报: 不能灵活地控制读写数据的次数和数量(应用层交给UDP多长的数据报文,UDP就原样发送,既不会拆分也不会合并)
- 缓冲区: UDP具有接收缓冲区,没有发送缓冲区(如果缓冲区满了,再到达的UDP数据就会被丢弃)
- UDP能够传输的数据最大长度是有限的,不能超过64k
TCP协议
TCP是如何保证可靠性的
- 协议头中的校验和和序列号
- 确认应答机制: 发送数据包携带序号,响应的数据包携带确认序号,发送端可以知道哪些数据被接收到了
- 超时重传机制: 如果主机A在一定时间里(单次传输的最大时间*2), 没有收到主机B发来的确认数据包,就会进行重发
- 连接管理机制: 正常情况下,TCP要经过三次握手才能建立连接和四次挥手才能断开连接
- 流量控制: 接收端接收能力有限(如果发送的太快,导致接收端缓存区被塞满,就会产生丢包), 需要告知发送端发送数据的大小,通过窗口大小字段来设置
- 拥塞控制: 发送端在不清楚网络状况的情况下,不会贸然发送大量的数据包,因为可能会导致网络拥堵
TCP是如何提高性能的
- 滑动窗口:滑动窗口就是无需等待应答而可以发送数据的最大值
- 接收端响应: ACK的下一个序号是多少,取决于接收到的连续数据包的最大序号,也决定了发送端下一次数据包要发送的内容
- 发送端: 窗口下滑的依赖条件是: 接收到的ACK数据包;ACK数据包中下一个序号的最大值作为窗口滑动的起始位置
- 滑动窗口也是实现流量控制的一种机制: 滑动窗口的大小意味着对方还有多大缓冲区可以用于接收数据,发送端可以根据滑动窗口的大小来确认应该发送多少数据
- 延迟应答: 接收端收到数据包后,不用马上返回ACK, 而是等待一段时间, 让进程有一段时间可以处理缓冲区的数据,这样返回的ACK数据包中,窗口大小的字段可以设置的更大,然后导致接收端流量控制机制产生影响,滑动窗口的大小也就可以设置的更大;
- 捎带应答:有些数据包是可以合并的,如ACK和自己要发送的数据包,多次网络传输数据合并在一起,就会提高效率
三次握手
TCP为什么需要三次握手建立连接?
- 三次握手才可以阻止重复历史连接的初始化(主要原因)
- 三次握手才可以同步双方的初始序列号
- 三次握手才可以避免资源浪费
四次挥手
TCP的拥塞控制机制
发送端在不清楚网络状况的情况下,贸然发送大量数据,可能导致网络拥塞,TCP引入了慢启动等机制,来处理这种问题:
- 慢启动: 一开始只发送少量数据,探测一下网络拥塞程度,然后逐渐增大传输的数据,拥塞窗口也就会从小到大指数增长
- 拥塞避免: 当拥塞窗口达到慢启动的阈值时,使用拥塞算法让拥塞窗口缓慢增加,不再指数增加,而是加法增大(每经过一个往返就把窗口大小+1),这样拥塞窗口就会按照线性规律缓慢增加
- 快重传与快恢复: 快速恢复丢失的数据包
- TCP开始启动的时候,慢启动的阈值等于窗口的最大值;超时重发的时候,慢启动的阈值会变为拥塞窗口最大值的一般,同时拥塞窗口置回1;
TCP与UDP的区别
- TCP是面向连接的,UDP无连接
- TCP是可靠的,UDP不可靠
- TCP只支持点对点的通信;UDP支持一对一,一对多,多对多通信
- TCP是面向字节流的;UDP是面向报文的
- TCP首部开销大,20个字节;UDP只有8个字节
- TCP可以保证传输的数据顺序,UDP不能保证
UDP怎么实现可靠
如果要是用UDP实现可靠,那就必须要解决两个问题: 丢包和包的顺序问题;在应用层实现
- 给数据包进行编号,按照包的顺序进行接收并存储
- 接收端收到数据包后,发送确认信息给发送端,发送端接收到确认数据后再继续发送下一个包;如果接收端接收到的数据包编号不是预期的编号,则要求发送端重新发送
已经实现了UDP可靠传输的协议:
- RUDP: 可靠数据报传输协议
- RTP: 实时传输协议,为数据提供了具有实时性的端对端传送服务
- UDT: 互联网传输协议,主要目的是支持高速广域网上的海量数据传输
在浏览器地址栏输入URL后,按下回车之后会经历哪些流程
- 浏览器向DNS服务器请求解析该URL中的域名和对应的IP地址
- 解析出IP地址后,根据该IP地址和默认端口号80,和服务器建立TCP连接,发起三次握手
- 连接建立完成后,浏览器向服务器发送HTTP请求
- 服务器对请求做出响应,并把对应的响应结果返回给浏览器
- 释放TCP连接
- 浏览器根据其请求得到的资源渲染页面,最终向用户呈现一个完整的页面
网络层
IP协议
网段划分
A类: 0.0.0.0到127.255.255.255
B类:128.0.0.0到191.255.255.255
C类: 192.0.0.0到223.255.255.255
D类: 224.0.0.0到239.255.255.255
E类: 240.0.0.0到255.255.255.255
ABC为私有地址,不能连上Internet的IP,主要用于局域网内主机联机
除了私有地址和特殊地址外,都是公网地址
IP地址和MAC地址
MAC: 网卡绑定的,在网卡出厂的时候就确定了,不能更改,代表物理地址
IP: 逻辑地址,代表网络上的某台设备;(由四位数字组成,网络号(前三位) + 主机号(第四位), 每一位都是0~255的数字)
IP地址描述的是路途总体的起点和终点,MAC地址描述的是路途上一个区间的起点和终点
网络设备发送数据的时候,需要知道MAC地址才能发送
数据的封装和分用
不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame)
其他各种协议
- ARP协议:建立主机IP地址和MAC地址之间的关系,在网络通信时,利用ARP可以通过IP地址和端口号获取到MAC地址
- DNS域名协议(基于UDP的应用层协议):把域名映射为IP地址
- NAT/NAPT技术: NAT技术可以将私网转化为公网IP,NAPT则是将私网IP和端口号都转化为公网IP+port
DNS协议
DNS中的递归查询和迭代查询
- 递归查询: 一般主机和本地DNS服务器之间就属于递归查询,就是当主机所询问的域名本地DNS服务器不知道时,本地DNS服务器就会以DNS客户的身份向其他域名服务器发出查询请求,直到得到结果并转交给主机
- 迭代查询: 一般DNS服务器之间属于迭代查询,就是加入DNS服务器A不能响应DNS服务器B的请求,那他会告诉DNS服务器B,下一步应该去找哪个DNS服务器,然后让其进行后续的查询
域名的解析过程(A查abc.com)
- 主机A先向本地服务器进行递归查询
- 本地服务器采用迭代查询,向一个根域名旧服务器查询
- 根域名服务器告诉本地服务器,我这里查不到,然后发给他下一步应该查询的顶级域名服务器的IP地址
- 本地域名服务器再去顶级域名服务器查询
- 顶级域名服务器告诉本地域名服务器,我这里也查不到,然后发给他下一步应该查询的权限域名服务器的IP地址
- 本地域名服务器向权限域名服务器查询
- 权限域名服务器告诉本地服务器所查询域名对应的IP
- 本地域名服务器最后再把查询结果告诉主机A