网络层次划分
首先要连通两台机器,完成bit流的传输,这就是物理层的作用。
然后,在两台机器传输bit流的时候难免会遇到错误,所以数据链路层应运而生,数据链路层提供错误检测、纠正数据,定义了如何格式化数据以进行传输等,数据链路层将bit流转换成了帧,交换机就工作在这一层。
随着网络节点的不断增加,点对点通信的时候需要经过多个节点,为了找到目标节点,找到最佳路径,就有了网络层。
随着网络通信需求的进一步扩大,通信过程中需要传输海量的数据,所以传输层就出现了。传输层解决了主机间的数据传输,并且解决了传输质量的问题,该层为OSI模型中最重要的一层。传输大数据时,将大数据切割成很小的数据片,然后将每一个数据片安排一个序列号,以便数据到达接收方节点的传输层时,能以正确的顺序重组,这个过程就称为排序。
为了提升用户体验,就有了会话层,会话层能自动收发包,自动寻址的功能。会话层的作用就是建立和管理应用程序之间的通信。
当两个系统语法不一致,想要通信时,就需要表示层。在表示层,数据将按照网络能理解的方案进行格式化。
此时,虽然发送方知道自己发送的内容,长度,但接收方完全不知道,所以应用层就诞生了。它规定发送方和接收方必须使用一个固定长度的消息头,消息头必须使用某种固定的组成,而且消息头里必须记录消息体的长度等一系列信息,以方便接收方能正确的解析发送方发送的数据。应用层旨在客户能更方便的应用从网络中接收的数据。数据传递没有该层也能传,不过传来传去也就是一堆二进制字节数组。
数据传输过程:
TCP协议(传输控制协议 Transmission Control Protocol)
TCP协议是一种面向连接的,可靠的,基于字节流的传输层通信协议
将应用层的数据流分割成报文段并发送给目标节点的TCP层,每个数据包都有一个序号,对方收到则返回ACK确定标志,未收到则重传。
使用奇偶校验和来检验数据正确性
TCP 标志位:(总共八个,这里介绍六个常用的)
URG : 紧急指针标志
ACK : 确认序号标志
PSH : push标志(指示接收方在接收到含有该标志的报文段数据时,应尽快将这个报文段交给应用程序,而不是在缓冲区排队)
RST : 重置连接标志reset
SYN : 同步序号,用于建立连接过程
FIN : finish标志,用于释放连接
滑动窗口:用于告知发送端,接收端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。
网络层包含的是IP地址(IP地址可以唯一标识主机),传输层包含的端口号和协议(如:TCP协议,TCP协议+端口号可以唯一标识主机中的一个进程)
TCP的三次握手及四次挥手
序号:seq,占32位,用来标识从发送端到接收端发送的字节流。
确认号:ack,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。
标志位:
SYN:发起一个新连接。
FIN:释放一个连接。
ACK:确认序号有效。
四次挥手:
为什么需要等待2MSL?(MSL的意思是报文的最长寿命)
答:防止第四次挥手时丢包问题,如果服务器没有收到第四次报文的内容,则服务器会重发第三次挥手的内容,当客户端在2MSL中再次接收到了第三次挥手的报文,则TIME-WAIT会清零,同时客户端再次发送第四次挥手的报文。
UDP(用户数据报协议 User Datagram Protocol)
UDP报文头结构:源端口,目标端口,数据包长度,奇偶校验和,用户数据
特点:面向非连接;不维护连接状态,支持同时向多个客户端传输相同的消息;数据包报头只有8个字节,额外开销小
TCP 与 UDP 的区别:
tcp面向连接的字节流,具有可靠性,有序性,速度较慢,重量级(体现在报文头大小:20个字节);
udp面向无连接的数据报,不可靠,无有序性,速度较快,轻量级(体现在报文头大小:8个字节);
TCP滑窗
RTT(Round Trip Time):发送一个数据包到收到对应的ACK,所花费的时间
RTO(Retransmission TimeOut): 重传时间间隔(tcp发送一个数据包之后会启动一个重传定时器,RTO就是这个定时时间,RTO是根据RTT计算出来的)
TCP使用滑动窗口做流量控制乱序重排,即滑动窗口保证了TCP的可靠性,保证了TCP的流控特性。
TCP最基本的传输可靠性是来源于确认重传机制,TCP滑动窗口的可靠性也是建立在确认重传的基础上的。
LastByteAcked:已发送并已接收到ack回复的最后一个字节
LastByteSent : 已发送但还未接受到ack回复的最后一个字节
LastByteWritten : 未发送,但可发送的最后一个字节;
LastByteRead : 已接受且已回复ack的最后一个字节
NextByteExpected : 收到的连续最大的sequence的位置
LastByteRcvd : 已接受但还未回复ack的最后一个字节;
AdvertisedWindow = MaxRcvBuffer - (LastByteRcvd - LastByteRead),MaxRcvBuffer是接收方能接收数据的最大量,也就是接收方缓存池的大小。根据上面这些数据就可以计算出当前接收方还可以接收的数据量大小 AdvertisedWindow,然后就可以将这个数据告诉发送方,从而计算出当前还可发送的数据大小,即 EffectiveWindow = AdvertisedWindow - (LastByteSent - LastByteAcked)
只有当32~35都被确认后,滑动窗口才会滑动到以36为开端的位置。
接收方存在三种状态:已接受并已回复ACK、未接收但准备接收、不可接收。其中未接收但准备接收的数据的大小,就是接收窗口的大小。PS:不存在已接收但未回复ACK的状态,因为回复ACK是TCP栈回复,没有延迟。
HTTP协议(超文本传输协议)
HTTP是基于请求与响应模式的无状态的协议,常基于TCP的连接方式。
主要特点:
支持客户端/服务器模式:客户端通过url向服务器发送请求,服务器向客户端发送响应信息
简单快速:客户端向服务器请求服务的时候,只需传送请求方法(GET, POST, HEAD)和路径
灵活:HTTP允许传入任意类型的数据对象,正在传输的类型由ContentType来标记
无连接:无连接含义:限制每次连接只处理一个请求,服务器处理完客户端的请求,并收到客户端的应答之后就断开连接
无状态:协议对于事务的处理没有记忆
想要保持连接一段时间,就是在http请求头中加入Connection: keep-alive,HTTP1.1默认长连接
HTTP请求/响应的步骤:
1、客户端连接到web服务器
2、发送http请求
3、服务器接收请求并返回HTTP响应
4、释放TCP连接
5、客户端浏览器解析HTML内容
在浏览器地址栏输入url,按下回车之后经历的流程:
1.DNS解析:服务器首先解析url中的域名所对应的ip地址
2.建立TCP连接:根据IP地址及端口建立tcp连接
3.发送HTTP请求
4.服务器处理请求并返回HTTP报文
5.浏览器解析渲染页面
6.连接结束
HTTP状态码
1xx:指示信息–表示请求已接收,继续处理
2xx:成功–表示请求已被成功接收,理解,处理
3xx:重定向–要完成请求必须进行更进一步的操作
4xx:客户端错误–请求有语法错误或请求无法实现
5xx:服务器端错误–服务器未能实现合法的请求
GET请求和POST请求的区别:
Http报文层面:GET请求信息放在URL,POST放在报文体中。
数据库层面:GET请求符合幂等性(对数据库的一次操作或多此操作结果是一致的)和安全性(对数据库的操作没有改变数据库中的数据),POST不符合,因为POST一般用来新建资源,因此会改变数据库中的数据(不符合安全性),而且每一次post请求都会添加一份新资源(不符合幂等性),put和post方式的最大区别也在于此,put方法是符合幂等性的。
其他层面:GET可以被缓存、被存储,而POST不行。
Cookie和Session的区别:
cookie存放才客户端,session存放在服务端
session相对于cookie更安全,因为用户可以轻易获得cookie信息,从而进行分析
若考虑减轻服务器性能,应当使用cookie
如果浏览器不支持Cookie或用户阻止了所有Cookie,可以把JSESSIONID附加在HTML页面中所有的URL上,这些页面作为响应发送给客户端。这样客户端点击任何一个链接都会把JSESSIONID带回服务器,这就是URL回写。而tomcat就是同时使用这两种机制来实现session的
HTTP与HTTPS的区别:
1.HTTPS需要到CA申请证书,HTTP不需要
2.HTTPS密文传输,HTTP明文传输
3.连接方式不同,HTTPS默认使用443端口,HTTP使用80端口
4.HTTPS = HTTP + 加密 + 证书 + 完整性保护,较HTTP安全
SSL(Security Sockets Layer,安全套接层)是为网络通信提供安全及数据完整性的一种安全协议,是操作系统对外的API,SSL3.0后更名为TLS,采用身份验证和数据加密保证网络通信的安全和数据的完整性。
-------------------------------Socket-----------------------------------