计网知识
计算机网络
\(MAC\)地址和\(IP\)地址有什么作用?
- IP地址是一种逻辑地址,是互联网上每一个网络和每一台主机分配一个逻辑地址。MAC是物理地址,定义网络设备。
- 使用ARP协议凭借MAC地址进行通信。ARP协议是一种用以解析地址的协议,更具通信方的IP地址就可以反查出对应的MAC地址。
- 设备更容易维修,网卡坏了可以直接换一个IP地址。
OSI的七层模型是什么?
- 物理层:底层数据传输:网线
- 数据链路层:定义数据的基本格式
- 网络层:定义IP地址
- 传输层:端到端的传输数据功能
- 会话层:控制应用程序之间会话能力
- 表示层:数据格式标识,基本压缩加密功能
- 应用层:一些应用软件
传输数据说明:
- 传输层:段
- 网络层:包
- 链路层:帧
- 物理层:比特流
TCP
三次握手
1、客户端向服务器发送SYN标志位(seq = x)。建立连接,等待确认。
2、服务器向客服端发送ACK(ack = x+1)确认收到、SYN(seq = y)标志位。
3、客户端收到SYN+ACK告诉服务器已收到。
四次挥手
1、客户端发送FIN包(FIN = 1)给服务端,告诉它自己的数据已经发送完全,请求中止连接。
2、服务端接受FIN包,回一个ACK包给客户端告诉他已经收到包了,此时还没有断开socket连接,而是等待剩下的数据传输完毕
3、服务端等待数据传输完毕后,向客户端发送FIN包,表明可以断开连接
4、客户端收到后等待一段时间,确保服务端不再有数据发过来,然后断开连接。
为什么连接的时候是三次,关闭的时候是四次?
因为S端收到了C端的SYN请求之后,可以直接发送SYN+ACK报文。但关闭的时候Socket不会直接关闭,所以需要发一个ACK,再等socket关闭在发送一个FIN报文。
为什么不是两次握手?
第一次握手是必须的 ,因为C端需要主动发起请求,但是在这个基础上,C端不一定可以保证S端收到了请求,所以S端需要对C端发起第二次握手。按道理这样已经完成了,但是如果信息丢失了呢?所以需要第三次握手来核实信息是否正确。
TCP 和 UDP
1、TCP是有链接的,有链接的意思是开始传输实际数据之前TCP的客户端的服务器端必须通过三次握手连接,结束后也要结束连接。UDP是无连接的。
2、TCP协议保证数据按顺序发送按顺序到达,提供超时重传来保证可靠性,但是UDP不保证按序到达,甚至不保证到达,只是努力交付。
3、TCP首部有20个字节,UDP有8个字节
4、TCP有流量控制和拥塞控制,UDP没有,网络拥堵不会影响发送端的发送效率
5、TCP是一对一的连接,UDP支持一对多,多对多,多对一。
TCP的头部
typedef struct _TCP{
short m_sSourPort; // 源端口号16bit
short m_sDestPort; // 目的端口号16bit
unsigned int m_uiSequNum; // 序列号32bit
unsigned int m_uiAcknowledgeNum; // 确认号32bit
short m_sHeaderLenAndFlag; // 前4位:TCP头长度;中6位:保留;后6位:标志位
short m_sWindowSize; // 窗口大小16bit
short m_sCheckSum; // 检验和16bit
short m_surgentPointer; // 紧急数据偏移量16bit
}
IP地址分类
A、B、C、D、E类
IP地址由两部分组成,即网络地址和主机地址。网络地址表示其属于互联网的哪一个网络,主机地址表示其属于网络中哪一台主机。
什么是TCP粘包/拆包?发生的原因?
一个完整的业务可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这个就是TCP的拆包和粘包问题。
原因
1、应用程序写入数据的字节大小大于套接字发送缓冲区的大小.
2、进行MSS大小的TCP分段。( MSS=TCP报文段长度-TCP首部长度)
3、以太网的payload大于MTU进行IP分片。( MTU指:一种通信协议的某一层上面所能通过的最大数据包大小。)
解决方案
- 消息定长。
- 在包尾部增加回车或者空格符等特殊字符进行分割
- 将消息分为消息头和消息尾。
- 使用其它复杂的协议,如RTMP协议等。
重传机制
TCP 针对数据包丢失的情况,会用重传机制解决。
超时重传
发送数据时,设定一个定时器,如果超过时间没有收到ACK应答报文,就会重传。
关于超时时间:
定义RTT:数据从网络一端传送到另一端一个来回的时间。
定义RTO:超时重传时间。
当RTO较大时,重发慢,没有效率。
当RTO较小时,可能没有丢包就重发,导致网络拥堵。
所以RTO应该略大于RTT的值。
每当遇到一次超时重传的时候,都会将下一次超时时间间隔设为先前值的两倍。两次超时,就说明网络环境差,不宜频繁反复发送。
超时触发重传存在的问题是,超时周期可能相对较长。
快速重传
为了解决超时重传的问题,我们创建了一种以数据驱动的重传。
假如连续收到了三个一样的ACK包,认为丢包,触发重传机制。
快速重传机制只解决了一个问题,就是超时时间的问题,但是它依然面临着另外一个问题。就是重传的时候,是重传之前的一个,还是重传所有的问题。
SACK
这种方式需要在 TCP 头部「选项」字段里加一个 SACK 的东西,可以将缓存地图发送给发送方,这样发送方就知道了哪些数据收到了,哪些数据没收到。
D-SACK
Duplicate SACK 又称 D-SACK,其主要使用了 SACK 来告诉「发送方」有哪些数据被重复接收了。
D-SACK 有这么几个好处:
-
可以让「发送方」知道,是发出去的包丢了,还是接收方回应的 ACK 包丢了;
-
可以知道是不是「发送方」的数据包被网络延迟了;
-
可以知道网络中是不是把「发送方」的数据包给复制了;
滑动窗口
TCP 引入了窗口这个概念。即使在往返时间较长的情况下,它也不会降低网络通信的效率。
窗口大小就是指无需等待确认应答,而可以继续发送数据的最大值。
接收窗口和发送窗口的大小是相等的吗?
并不是完全相等,接收窗口的大小是约等于发送窗口的大小的。
因为滑动窗口并不是一成不变的。比如,当接收方的应用进程读取数据的速度非常快的话,这样的话接收窗口可以很快的就空缺出来。那么新的接收窗口大小,是通过 TCP 报文中的 Windows 字段来告诉发送方。那么这个传输过程是存在时延的,所以接收窗口和发送窗口是约等于的关系。
流量控制
动机:
一般来说,我们总是希望数据传输可以更快一些。
但如果发送方把数据发送的过快,接收方可能来不及接受,这就会造成数据的丢失。
所谓流量控制:就是让发送方的发送速率不要太快,要让接收方来得及接收。
工具:
利用滑动窗口。
TCP接收方利用自己的接收窗口的大小来限制发送窗口的大小。
TCP发送方收到接收方的零窗口通知后,启动持续计时器。超时后,向接收方发送零窗口探测报文。
TCP 拥塞控制算法
发送窗口的值是swnd = min(cwnd, rwnd),也就是拥塞窗口和接收窗口中的最小值。
TCP拥塞控制:在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏,这种情况就叫做网络拥塞。
Tahoe 和 Reno
Tahoe:收到三次重复确认,就进入快重传立即重发丢失的数据包,同时将慢启动阈值设置为当前拥塞窗口的一般,拥塞窗口设置为1MSS,进入慢启动状态。
Reno:收到三次重复确认,进入快重传,不进入 慢启动状态,将窗口减半,进入拥塞控制阶段,即快恢复。
慢启动
TCP 在刚建立连接完成后,首先是有个慢启动的过程,这个慢启动的意思就是一点一点的提高发送数据包的数量,如果一上来就发大量的数据,这不是给网络添堵吗?
慢启动的算法记住一个规则就行:当发送方每收到一个 ACK,就拥塞窗口 cwnd 的大小就会加 1。
有一个叫慢启动门限 ssthresh (slow start threshold)状态变量。
当 cwnd < ssthresh 时,使用慢启动算法。
当 cwnd >= ssthresh 时,就会使用「拥塞避免算法」。
拥塞避免算法
那么进入拥塞避免算法后,它的规则是:每当收到一个 ACK 时,cwnd 增加 1/cwnd。
拥塞避免算法就是将原本慢启动算法的指数增长变成了线性增长,还是增长阶段,但是增长速度缓慢了一些。
拥塞发生
快重传:
当接收方发现丢了一个中间包的时候,发送三次前一个包的 ACK,于是发送端就会快速地重传,不必等待超时再重传。
TCP 认为这种情况不严重,因为大部分没丢,只丢了一小部分,则 ssthresh 和 cwnd 变化如下:
cwnd = cwnd/2 ,也就是设置为原来的一半;
ssthresh = cwnd;
快速恢复算法
快速重传和快速恢复算法一般同时使用,快速恢复算法是认为,你还能收到 3 个重复 ACK 说明网络也不那么糟糕。
正如前面所说,进入快速恢复之前,cwnd 和 ssthresh 已被更新了:
cwnd = cwnd/2 ,也就是设置为原来的一半;
ssthresh = cwnd;
然后,进入快速恢复算法如下:
拥塞窗口 cwnd = ssthresh + 3 ( 3 的意思是确认有 3 个数据包被收到了)
重传丢失的数据包
如果再收到重复的 ACK,那么 cwnd 增加 1
如果收到新数据的 ACK 后,设置 cwnd 为 ssthresh,接着就进入了拥塞避免算法
DNS
DNS:域名和IP地址相互转换的分布式数据库。
将主机域名转换为ip地址,属于应用层协议,使用UDP传输。
工作过程
- 当用户输入域名时,浏览器先检查自己的缓存中是否 这个域名映射的ip地址,有解析结束。
- 若没命中,则检查操作系统缓存(如Windows的hosts)中有没有解析过的结果,有解析结束。
- 若无命中,则请求本地域名服务器解析( LDNS)。
- 若LDNS没有命中就直接跳到根域名服务器请求解析。根域名服务器返回给LDNS一个 主域名服务器地址。
- 此时LDNS再发送请求给上一步返回的gTLD( 通用顶级域), 接受请求的gTLD查找并返回这个域名对应的Name Server的地址
- Name Server根据映射关系表找到目标ip,返回给LDNS
- LDNS缓存这个域名和对应的ip, 把解析的结果返回给用户,用户根据TTL值缓存到本地系统缓存中,域名解析过程至此结束
DNS使用TCP还是UDP协议?
DNS占用53号端口,同时使用TCP和UDP协议
DNS在区域传输的时候使用TCP协议,其他时候如域名解析时使用UDP协议
其他知识:
区域传输:辅域名服务器会定时向主域名服务器进行查询以便了解数据是否有变动。如有变动,会执行一次区域传送,进行数据同步。区域传送使用TCP是因为数据同步传送的数据量币一个请求应答的数据量要多得多
域名解析:客户端向DNS服务器查询域名,一般返回的内容都不超过512字节,用UDP传输即可,这样DNS服务器负载更低,响应更快。
HTTP
HTTP长连接和短连接的区别
在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。
而从HTTP/1.1起,默认使用长连接,用以保持连接特性。
说一下一次完整的HTTP请求过程包括哪些内容?
解析域名->建立TCP链接->发起http请求->服务器响应请求,获取html代码->解析html代码 ,获得资源->呈现给用户
GET和POST的区别
GET和POST是什么?HTTP协议中的两种发送请求的方法。
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
GET在浏览器回退时是无害的,而POST会再次提交请求。
GET产生的URL地址可以被Bookmark,而POST不可以。
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
GET请求只能进行url编码,而POST支持多种编码方式。
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
GET请求在URL中传送的参数是有长度限制的,而POST么有。
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
GET参数通过URL传递,POST放在Request body中。
HTTP请求方法你知道多少?
客户端发送的 请求报文 第一行为请求行,包含了方法字段。
根据 HTTP 标准,HTTP 请求可以使用多种请求方法。
HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
序 号 | 方法 | 描述 |
---|---|---|
1 | GET | 请求指定的页面信息,并返回实体主体。 |
2 | HEAD | 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头 |
3 | POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。 |
4 | PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
5 | DELETE | 请求服务器删除指定的页面。 |
6 | CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 |
7 | OPTIONS | 允许客户端查看服务器的性能。 |
8 | TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
9 | PATCH | 是对 PUT 方法的补充,用来对已知资源进行局部更新 。 |
HTTPS和HTTP的区别
1、HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全, HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。
2、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
HTTPS是如何保证数据传输的安全,整体的流程是什么?(SSL是怎么工作保证安全的)
(1)客户端向服务器端发起SSL连接请求;
(2) 服务器把公钥发送给客户端,并且服务器端保存着唯一的私钥
(3)客户端用公钥对双方通信的对称秘钥进行加密,并发送给服务器端
(4)服务器利用自己唯一的私钥对客户端发来的对称秘钥进行解密,
(5)进行数据传输,服务器和客户端双方用公有的相同的对称秘钥对数据进行加密解密,可以保证在数据收发过程中的安全,即是第三方获得数据包,也无法对其进行加密,解密和篡改。
Session是什么?
除了可以将用户信息通过 Cookie 存储在用户浏览器中,也可以利用 Session 存储在服务器端,存储在服务器端的信息更加安全。
Session 可以存储在服务器上的文件、数据库或者内存中。也可以将 Session 存储在 Redis 这种内存型数据库中,效率会更高。