计算机网络:认证和授权 DNS 域名解析过程(如何转换为ip地址) http无状态 5**服务端错误相关的响应状态码 tcp某次握手丢失会有什么现象?
目录
认证和授权
Token和JWT的区别
DNS 域名解析(如何转换为ip地址)
socket是什么?
什么是TCP/IP协议?
TCP如何保证可靠性?
http无状态
5**服务端错误相关的响应状态码
tcp某次握手丢失会有什么现象?
认证和授权
认证:用户名密码登录,二维码登录,手机短信登录,指纹,刷脸
Token和JWT的区别
服务器是如何区分用户的?
浏览器登录将用户名和密码发送到服务器 服务器收到知道是哪个用户发送的请求
之后客户端的请求如果都带上密码是比较危险的,客户端携带容易导致密码的泄漏;
所以通常是由服务器返回标记信息:
浏览器收到之后,将信息保存,以后的每次请求都会携带 服务器就可以区分,实现了记住登录状态,这个就是cookie;
注意Cookie的保存跟发送是由浏览器自动实现的,不需要网页代码额外处理
此时的cookie是有问题的,因为数据里面只有id和名字,很有可能被恶意猜到,悄悄向服务器请求,拿到同样的权限
如何让cookie防止被篡改呢?数据签名!!!
取哈希作为签名,签名随同数据一并发给浏览器作为Cookie
这样后面的请求服务器就可以通过验证签名来判断数据是否合法
而恶意攻击的人不知道服务器的密令
所以很难伪造签名
有时候我们不想让浏览器Cookie保存太多数据,那么还可以把数据保存在服务端,并生成一个足够长的随机Key用于与数据关联
然后把Key返回给浏览器写入Cookie
这样在下次请求时,服务器就可以根据Key查找出保存在服务器的内容,这个过程就叫Session,而Key则是SessionID
DNS 域名解析(如何转换为ip地址)
是通过权威域名服务器进行的--可以吧域名服务器当做成一张表,记录每个url对应的ip地址
如何访问域名服务器?顶级域名服务器知道!!!
如何访问顶级域名服务器呢??根域名服务器知道
我们在浏览器输入www.baidu.com之后,浏览器先会检查缓存和本地的host文件,查询有没有域名所对应的ip地址,如果有就直接使用
如果没有,dns客户端会向dns服务器发送请求
本地的dns服务器收到请求,会先查看自己的缓存记录,如果有,就直接返回;
如果没有,会向根域名服务器发送请求,根域名服务器返回顶级域名服务器的地址,找到顶级返回权威域名服务器的ip地址
最后把ip返回给我们的主机
socket是什么?
如图,Socket是基于应用层与TCP/IP协议族之间的一个抽象,他将TCP/IP协议里面复杂的通信逻辑进行封装,对用户来说,只要通过一组简单的API就可以实现网络的连接和通信。
Socket的通信过程如下图,首先,服务端初始化ServerSocket,然后对指定的端口进行绑定,接着对端口及进行监听,通过调用accept方法阻塞,此时,如果客户端有一个socket连接到服务端,那么服务端通过监听和accept方法可以与客户端进行连接。
什么是TCP/IP协议?
如果遇到一个比较大的文件,就需要分开传输
拆分分别大包发送
Ip地址是ip协议提供的一种统一的地址格式
ip地址是逻辑上的地址 代表不了物理最终的地址
ip地址就是最终的发送地址
ip协议就是数据传输的路径
Tcp(传输控制协议)是一种面向连接、可靠的基于字节流的传输层协议
tcp类似于分解包的过程
ip地址相当于给包裹添加标签:原来的和目标的地址 在数据上封装一层
送到目的地址 目的地址查看数据的显示
路由器是工作在ip协议层的
路由器,是连接互联网各局域网、广域网的设备,他会根据信道的情况自动选择和设置路由以最佳路径,按前后顺序发送数据
tcp协议需要保证数据的完整性
TCP可以看成是一种字节流,它会处理IP层或以下的层的丢包、重复以及错误问题。在连接的建立过程中,双方需要交换一些连接的参数。这些参数可以放在TCP头部。
tcp确保数据的完整性,并且使得重复的数据被丢弃掉
TCP提供了一种可靠、面向连接、字节流、传输层的服务,采用三次握手建立一个连接。采用4次挥手来关闭一个连接。
所以通常tcp的传输是比较慢的
TCP如何保证可靠性?
(1)重传机制 (2)滑动窗口(3)流量控制(4)拥塞控制
(1)重传机制解决数据丢失的问题
实现方法:序列号 确认应答--定时器
重传的策略:(1)超时重传 如果规定时间内没有回包,那么就进行重传--启动定时器
(2)快速重传:超时之前收到三个相同的数据包确认,直接重传去失的数据
到底是重传一个还是重传所有的呢?
就出现了SACK(能够确认是重传什么,保证只去重传丢失的数据)
DSACK(重复选择确认,把重复收到的包通过sack告知发送方)
服务器返回的ack是不会进行重传的,只会发送一次,其他的fin包会多次发送
DSACK解决了对于发送方的问题:确定是传递的数据包丢失了,还是返回的ack丢失了,还会解决网络超时的问题
滑动窗口解决返回多次的ack的问题,不用对每一个ack去应答,否则网络的吞吐量就太低了
窗口:没有应答的情况下,发送方可以发送多少数
http无状态
5**服务端错误相关的响应状态码
5**范围的状态码,表示服务器未能正常处理客户端的请求而出现意外错误。
500表示是服务器的问题,但是具体是什么问题没有描述
501:例如有的服务器不支持post请求,就无法理解这个请求,服务器不支持该请求方法
503:遇到服务器正在处于系统维护,无法处理请求
tcp某次握手丢失会有什么现象?
1,如果第一个包,即A发给B的SYN中途被丢,没有到达B,会怎么办?
第一个包,即A发给B的SYN中途被丢,没有到达B:A会周期性超时重传,直到收到B的确认
2,如果第二个包,即B发给A的SYN+ACK中途被丢,没有到达A,会怎么办?
第二个包,即B发给A的SYN+ACK中途被丢,没有到达A:B会周期性超时重传,直到收到A的确认
3,如果第3步,A发给B的确认ACK丢了,该怎么办?A会重传这个ACK吗?第三个包,即A发给B的ACK中途被丢,没有到达B
A发完ACK,单方面认为TCP为Established状态,而B显然认为TCP为Active状态:a.假定此时双方都没有数据发送,B会周期性超时重传,直到收到A的确认,收到之后B的TCP连接也为Established状态,双向才可以发包,才算是建立连接;
b.假定此时A有数据发送,B收到A的Data+ACK,自然会切换为established状态,并接受A的
Data。
C.假定B有数据发送,数据发送不了,会一直周期性超时重传SYN+ACK,直到收到A的确认才可
以发送数据。