OSI七层协议:
应用层、表示层、会话层、传输层、网络层、数据链路层、物理层;
应用层:HTTP ,HTTPS,FTP,DNS 传输层:TCP、UDP 网络层:IP 数据链路层:ARP RARP
TCP/IP 四层协议 网络接口层、网际层、运输层、应用层
应用层:通过应用进程间的交互来完成特定的网络应用; 运输层:负责向两台主机之间的通信提供数据传输服务; 网络层:选择合适的网间路由和交换节点,确保数据及时送达; 数据链路层:
三次握手 & 四次挥手
三次握手过程: 首先,客户端向服务端发送一个SYN信号,随机产生当前序列号x,客户端进入SYN-SENT状态;第二,服务端接监听到客户端报文后,向客户端发送一个确认信号,打开SYN表示和ACK标志,随机产生当前序列号与,确认序列号为x+1,服务端进入SYN-RCVD状态;最后客户端接收到后,向服务端发送一个确认信号,打开ACK标志位,当前序列号为x+1;确认序列号为y+1,客户端进入ESTABLISHED状态;服务端接收后,也进入ESTABLISHED状态;之后就可以进行数据传输了。
进行三次握手的原因: 1.同步双方序列号; 2. 确保双方都建立了连接; 3.防止已经失效的连接请求报文突然又传到了服务器。如果是两次握手,客户端第一次连接请求发送时,由于网络延迟等原因,导致服务端没有收到,此时客户端又重新发送了一个请求链接,服务端接收后返回一个确认信息,双方简历连接;通信完成后双方关闭连接,此时客户端旧连接到达了服务器,由于只有两次握手,服务端又与客户端重新建立连接了,会导致不必要的错误和资源浪费。
四次挥手过程:第一,客户端向服务器发送一个请求结束报文,打开FIN标志位,当前序列号为u,客户端进入FIN-WAIT-1状态;第二,服务端接收后,先向客户端返回一个确认报文,打开标志位ACK,当前序列号为v,确认序列号u+1,进入CLOSE-WAIT状态。此时服务端还能向客户端发送数据,直到全部发送完毕,服务端向客户端发送结束报文,打开FIN和ACK标志位,当前序列号w,确认序列号u+1,进入LAST_ACK状态;客户端收到后就向服务端发送一个确认报文,打开ACK标志位,当前序列号u+1,确认序列号w+1,客户单进入TIME_WAIT状态,等待2MSL后,进入CLOSED状态。服务端接收确认信号后,也进入CLOSED状态。
四次挥手的原因:因为服务端接收到客户端关闭连接请求后,可能还有数据要传送给客户端,所以先给客户端发送一个确认报文,等数据传送完毕后,在通知客户端进行连接关闭。 2MSL原因:MSL报文生存最大时间。确保服务端能够接收到客户端的确认应答。且同样防止已失效的连接请求报文出现在下一次连接请求中。
TCP&UDP
TCP 与UDP的区别
- TCP是面向连接的,UDP是无连接的,面向报文的;
- TCP的传输是可靠的,UDP是不可靠的,尽最大努力交付;
- TCP连接时一对一的,而UDP支持一对多,多对一,一对一和多对多。
- TCP的以字节流形式传输,UDP则传输的是数据报文段;
- TCP的传输效率较低,UDP的传输效率较高;
- TCP应用与要求可靠性高的场景,UDP是应用与要求通信速度高的场景。
TCP如何保证传输可靠性
- TCP会将应用数据分割成它认为合适的数据块;
- TCP对每一个数据包进行编号,接收方按照编号进行排序,将有序数据传输给应用层;
- 校验和:TCP维护首部和数据的校验和,用来检测数据在传输过程中是否有变化,如果收到的校验和有差错,将会丢弃这个数据报;
- TCP会丢弃重复的数据;
- 使用流量控制防止丢包;
- 拥塞控制:网络拥塞时,减少数据的发送;
- ARQ协议:实现可靠传输。
- 超时重传:防止丢包。
ARQ协议
**停止等待ARQ:**每发送一组报文,就会等待确认,收到确认信息后,再继续发送下一组报文; 重试重传:是指超过一段时间后,仍然没有接收到确认。所以在每发完一组信息后就会设置一个超时计时器,一般情况下重传时间比报文平均往返时长长一些。
连续ARQ协议:发送方维持一个发送窗口,这个窗口内的分组可以连续发送,不需要等待对方确认。接受方采用累计确认,对按序到达的最后一个分组发送确认,表明这个分组之前的所有分组都已经正确收到了。
拥塞控制
- 拥塞控制目的:避免发送发的数据填满整个网络
- 拥塞窗口:拥塞窗口cwnd是发送方维护的一个的状态变量,它会根据网络的拥塞程度动态变化的。
- 拥塞窗口变化规则:网络出现拥堵就会减小,网络没有出现拥堵就会增大。而发送窗口大小就是拥塞窗口和接收窗口中的较小的那个值。
- 网络拥塞的判断:只要发送方在规定时间内没有接收到ack应答报文,即发生了超时重传,就认为网络出现拥塞。
- 拥塞控制的算法:
慢启动 慢启动就是在初始化的时候,拥塞窗口cwnd = 1,表示可以传一个MSS大小的数据。当收到这个数据的ACK应答报文后,拥塞窗口就会等于2,就能一次性发送2个数据;在接收到这两个数据的ACK应答报文后,拥塞窗口就会等于4…以此类推,也就是发送方每收到一个ACK,拥塞窗口cwnd的大小就加1。 但拥塞窗口不会无止境增加,而是有一个ssthresh值,也就是慢启动门限。当cwnd 小于 ssthresh值时,使用慢启动算法,但当大于或等于这个门限值,就会启动拥塞避免算法。 慢启动门限大小一般为:ssthresh = 65535字节 拥塞避免 拥塞避免就是:发送发每当收到一个 ACK 时,拥塞窗口cwnd就会增加 1/cwnd。 当拥塞窗口不断增加时,可能会发生网络拥塞,这是就会对丢失的数据进行重传,触发重传机制,进入了拥塞发生算法。 拥塞发生 不同的重传机制会有不同的拥塞发生算法 超时重传下得拥塞算法: 慢启动门限ssthresh设置为 ssthresh = ssthresh / 2;拥塞窗口大小重置为1;重新开始慢启动。 快速重传:拥塞窗口变为原来的一半,即cwnd = cwnd / 2;慢启动门限设置为拥塞窗口大小,即 ssthresh = cwnd;然后进入快速恢复算法 快速恢复 拥塞窗口cwnd = ssthresh + 3 ( 3 的意思是确认有 3 个数据包被收到了) 重传丢失的数据包 如果再收到重复的 ACK,那么 cwnd 增加 1 如果收到新数据的 ACK 后,设置 cwnd 为 ssthresh,接着就进入了拥塞避免算法
URL输入后
- DNS根据输入的URL进行域名解析,获得对应的IP地址;
- TCP三次握手建立连接;
- 浏览器发送http请求;
- 服务器处理请求返回http报文;
- 浏览器解析返回数据并渲染页面;
- TCP四次挥手断开连接。
HTTP & HTTPS
HTTP长连接和短链接
在HTTP1.1之前,http默认短链接。客户端与服务端没进行一次HTTP操作就建立一次连接,任务结束就中断连接。 从HTTP1.1开始,默认使用长连接,只需要建立一次连接,就能进行多次http通信。 长连接响应头:Connection : keep-alive; Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间
cookie和session的区别
相同点:cookie和session都是用来跟踪浏览器用户身份的会话方式; 区别: cookie数据保存在客户端;session数据保存在服务端。 cookie不是很安全,因为可以分析存放在本地的cookie进行cookie欺骗,考虑安全性建议使用session; session会在服务器上保存一定时间,当访问增多,会影响服务器性能。 一般登录等重要信息存在在session,其他信息存放在cookie中。
HTTP1.0 VS HTTP1.1
- 长连接:1.0使用短链接;1.1使用长连接;
- 新增了错误状态码:如409表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
- 缓存处理:增加了更多可供选择的缓存头来控制缓存策略:Entity tag; If-Unmodified-Since; If-Match; If-None-Match;
- 带宽优化及网络连接的使用 :HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
HTTP VS HTTPS
- 端口:http默认80;http默认443;
- 安全性:http运行在TCP之上,所有传输内容都是明文;https是运行在SSL/TLS上的HTTP协议,所有传输内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器的证书进行了非对称加密。
---------补充-----
补充
http报文内容,和tcp的关系
请求报文:
请求方法 URL 协议版本
头部字段 值
...
请求数据
响应报文:
协议版本 状态码 状态码描述
头部字段 值
...
返回数据
Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求。Http会通过TCP建立起一个到服务器的连接通道,当本次请求需要的数据完毕后,Http会立即将TCP连接断开,这个过程是很短的。所以Http连接是一种短连接,是一种无状态的连接。
TCP是底层协议,定义的是数据传输和连接方式的规范。 HTTP是应用层协议,定义的是传输数据的内容的规范。 HTTP协议中的数据是利用TCP协议传输的,所以支持HTTP就一定支持TCP
HTTP GET 和POST的区别
- GET方法一般用于获取资源;POST方法一般用于表单等实体主体传输;
- GET方法的参数是放在URL末尾,POST方法一般放在请求体中。
- GET方法是安全、幂等的,由于是获取数据,不会产生副作用,可缓存;POST不是幂等的,且不可缓存。
|