- 物理层主要定义物理设备标准,主要作用是传输Bit流,网卡工作这这层中,数模转换与模数转换
- 数据链路层,在传输bit流的过程中会产生错传、数据传输不完整的可能,因此数据链路层定义如何格式化数据,以及如何控制对物理介质的访问,本层将bit数据组成了帧,其中交换机在本层工作,对帧解码,并根据帧中的信息把消息发送到正确的接收方
- 网络层,·主要功能将网络地址翻译成对应的物理地址,路由器数据网络层,此层的数据称为数据包,此层的协议为IP协议,路由器属于本层
- 传输层,传输层解决了主机间的传输,并且解决了传输质量,协议有TCP/UDP
- 会话层,建立和管理应用程序之间的通信
- 表示层,解决不同系统之间的通信语法问题
- 应用层,更方便的应用层网络接收到的数据 http协议
TCP/IP
OSI的实现:TCP/IP四层网络模型
TCP/IP是协议族的统称
TCP的三次握手与四次挥手
TCP简介:
- 面向连接的、可靠的、基于字节流的传输通信协议
- 将应用的数据流分割成报文段并发送给目标节点的TCP层
- 数据包都有序号,对方收到则发送ACK确认,未收到则重传
- 用奇偶校验和函数来检验数据在传输过程中是否有误
TCP报文头
源端口:
-
目的端口:唯一标识一台机器上的一个进程 -
序号(seq):占四个字节,编号,加入当前是107,数据长度100,下一个报文序号就是207 -
确认号:4字节,期望收到对方下一个字节的第一个报文的第一个数据字节的序号 -
数据偏移:头部有可选字段,长度不确定,所它指出tcp数据距离tcp报文的起始处有多远 -
保留域:以后使用,目前是0 -
Tcp flgs
-
URG:紧急指针标志,1表示有效,为0无效 -
ACK:确认序号标志: 1有效,0为无效,上面的确认号是否有效由此确定 -
PSH:push标志 1表示生效,代表接收方需要尽快将报文段交给应用程序,而不是在队列里排队 -
RST:重置连接标志,重置由于主机崩溃或其他原因出现错误的连接,或者用于拒绝非法的报文段 -
SYN:同步序列号,用于建立连接过程,在连接请求中,syn等于1 ACK等于0代表该数据段没有使用捎带的数据域 -
FIN:finish标志,用于释放连接,为1是表示发送方没有数据要发送了,需要断开连接 -
window:滑动窗口大小,发送端接收端的缓存大小,以此达到控制发送端的发送速率,从而达到流量控制 -
检验和:奇偶校验,对整个tcp报文段包括TCP头部和tcp数据以16位进行计算,由发送端进行计算和存储,接收端进行校验 -
紧急指针:上述urg为1生效,指出本报文段的紧急数据字节数 -
可选项:长度可变,定义其他的可选参数
TCP三次握手流程
三次握手:首先客户端和服务器都是关闭状态,假设客服端主动打开,服务器被动打开
服务器先创建传输控块时刻准备接收连接请求,服务器进入listen监听状态,客户端发出连接请求报文,报文头syn=1,初始序号seq=x,此时客户端进入同步已发送状态,发送过去的报文段是不能携带数据的,并且会消耗掉一个序号,这是第一次握手
服务器接收到如果同意连接就发送确认报文,确认报文中包含了SYN=1,ACK=1,seq=y,ack=x+1,因为x序列号已经消耗,所以ack等于x+1,发送完成后服务器进入同步收到状态,这是第二次握手
当客户端收到确认报文后,会向服务端一个给出一个确认,ACK=1,seq=x+1,ack=y+1,发送完成后客户端进入已建立连接状态,这个报文段可以携带数据,如果不携带数据就不会消耗seq序号
当服务器收到确认后也会进入已建立连接状态,三次握手完成
总结
为什么需要三 次握手才能建立连接
为了初始化Sequence Number的初始值,通信的双方要互相通知对方自己的初始化的seq,就是上面的x和y,这个号要作为以后通讯的标志,以保证应用层接收到的数据不会因为网络上的传输而乱序,
即tcp会用这个序号拼接数据
首次握手的隐患-syn超时
问题原因
- Server收到Client的SYN,回复SYN-ACK的时候未收到ACK确认
- Server不断重试直至超时,Liunx默认等待63秒才断开连接(5次)
- 可能会收到SYN Flood风险,恶意程序不停的发,让连接耗尽不能处理正常请求
针对SYN Flood的防护措施
SYN队列满后,通过tcp_syncookies参数回发SYN Cookie (原地址端口+目标地址端口+时间戳)
若为正常连接则Client会回发SYN Cookie,直接建立连接
建立连接后,Client出现故障怎么办
保活机制
- 向对方发送保活探测报文,如果未收到响应则继续发送
- 尝试次数达到保活探测数仍未收到响应则中断连接
TCP的四次挥手
第一次挥手:seq的值等于之前最后发送过来的数据最后一个字节的序号+1,此时客户端进入FIN-WAIT-1状态,tcp规定,就算fin报文段不携带数据也要消耗掉序号
第二次挥手,服务端发送ACK包到客户端,并且进入close-wait状态
为什么会有Time_wait状态
原因
- 确保有足够的时间让对方收到ACK包
- 避免新旧连接混淆
为什么需要四次挥手才能断开连接
因为全双工,发送方和接收方都需要FIN报文和ACK报文
服务器出现大量CLOSE_WAIT状态的原因
对方关闭socket连接,我方忙于读或写,没有及时关闭连接
- 检查代码,特别是释放资源的代码
- 检查配置,特别是处理请求的线程配置
TCP与UDP区别
UDP简介
UDP报文结构
UDP的特点
- 面向非连接
- 不维护连接状态,支持同时向多个客户端传输相同的消息
- 数据包报头只有8个字节,额外开销较小
- 吞吐量只受限于数据生成速率、传输速率以及机器性能
- 尽最大努力交付,不保证可靠交付,不需要维持复杂的链接状态表
- 面向报文,不对应用程序提交的报文信息进行拆分或合并
TCP与UDP区别
结论
- 面向连接vs无连接 Udp适合消息的多播发布
- 可靠性
- 有序性(TCP利用序列号保证消息报的顺利交付,到达可能无序,但是最终会排序,而UDP不具备有序性)
- 速度(TCP要建立连接保证消息的可靠性和有序性)
- 量级TCP重量级UDP轻量级体现在元数据的头大小,TCP是20字节,UDP是8字节
TCP的滑动窗口
RTT和RTO
- RTT:发送一个数据包到收到对应的ACK,所花费的时间
- RTO:重传时间间隔
TCP使用滑动窗口做流量控制与乱序重排
窗口数据的计算过程
LastByteAcked:接收端已确认的ACK确认的seq位置
LastByteSent:以发送但未收到ack确认的长度
LasByteWritten:指向上层应用已写完的最后一个字节
滑动窗口的基本原理
TCP会话的发送方
数据分为四类:已发送并且得到回应的,已发送但未得到回应的,未发送但得到端允许发送的,未发送且由于达到了window的大小不允许发送
TCP会话的接收方,和发送方一致
HTTP
http是属于应用层的协议,是基于请求与响应模式的无状态的基于应用层的协议,主要特点:
- 支持客户/服务器模式
- 简单快速(客户端向服务端请求服务的时候只需传送请求方法和路径,请求方法有get,post)
- 灵活 http允许传输任意类型的数据对象
- 无连接 无连接的含有是限制每一次连接只处理一个请求,节省传输时间,http1.1起使用长连接
- 无状态 协议对事务处理没有记忆能力,
HTTP请求结构
、
包含:请求行 请求头部 空行 请求正文 四个部分组成
请求行包含:
请求方法:get post
URL:
协议版本
请求头部包含:
由若干头部字段组成,用来设置一些http请求的参数,例如host,Connection
请求空行是必须的,即使请求正文为空
请求正文:
HTTP响应结构
状态行,响应头部 空行 响应正文
协议版本 状态码 状态码描述
请求响应步骤
客户端连接到web服务器建立一个tcp套接字连接
- 发送http请求
- 服务端接收到请求并返回HTTP响应
- 释放连接TCP连接(若连接模式为close则服务器主动断开连接,若为长连接则会保持一段时间连接)
- 客户端浏览器解析HTML内容
在浏览器地址栏键入URL,按下回车之后经历的流程
DNS解析:首先浏览器会依据URL逐层查询DNS服务器缓存,解析URL的域名所对应的ip地址,DNS缓存从近到远依次是,浏览器缓存->系统缓存->路由器缓存->ips服务器缓存->根域名服务器缓存->顶级域名服务器缓存 , 从哪个缓存找到对应的ip就直接返回,不再查找后续缓存,
**TCP连接:**根据Ip地址和对应端口和服务器建立TCP连接
发送HTTP请求:该请求发送给服务器
服务器处理请求并返回HTTP报文
浏览器解析渲染页面
连接结束:释放TCP连接,TCP四次挥手
** **
HTTP状态码
五种可能都取值
**1xx:**指示信息请求已接收
**2xx:**成功-表示请求已被成功接收、理解、接受。
**3xx:**重定向–要完成请求必须进行更进一步的操作
**4xx:**客户端错误–请求有语法错误或请求无法实现
**5xx:**服务器错误–服务器未能实现合法的请求
常见状态码
200 OK:正常返回信息
400 Bad Request:客户端请求有语法错误,不能被服务器所理解
401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden:服务器收到请求,但是拒绝提供服务
404 Not Found:请求资源不存在,eg,输入了错误的URL
500 Internal Server Error:服务器发生了不可预期的错误
503 Server Unavailable:服务器当前不能处理客户端请求,一段时间后可能恢复
GET请求和POST请求的区别
从三个层面来解答:
Http报文层面:GET将请求信息放在URL,POST放在报文体中 post更安全 get的参数是有长度限制的,post没有
数据库层面:GET符合幂等性和安全性,POST不符合
其他层面:GET可以被缓存、被存储,而POST不行
COOKIE和Session的区别
Cookie
- 是由服务器发送给客户端的特殊信息,以文本的形式存放在客户端
- 客户端再次请求的时候,会把Cookie回发
- 服务器接收到后,会解析Cookie生成与客户端相对应的内容
cookie的设置与发送过程
Seesion简介
-
- 服务器端的机制,在服务器上保存的信息
- 解析客户端请求并操作session id,按需保存状态信息
session实现方式
cookie和seesion的区别
-
- cookie数据存放在客户的浏览器上,session数据放在服务器上
- Session相对于Cookie更安全
- 若考虑减轻服务器负担,应当使用cookie
HTTP和HTTPS的区别
SSL(Security Sockets Layer 安全套接层)
- 为网络通信提供安全及数据完整性的一种安全协议
- 是操作系统对外提供的API,SSL3.0后更名为TLS
- 采用身份验证和数据加密保证网络通信段安全和数据的完整性
加密方式:
- 对称加密:加密和解密都使用同一个密钥 效率高
- 非对称加密:加密使用的密钥和解密使用的密钥是不相同的,加密的数据是有限的
- 哈希算法:将任意长度的信息转换为固定长度的值,算法不可逆,MD5
- 数字签名:在数据后面加上某些内容给你,证明某个消息或者文件是某人发出/认同的
HTTPS数据传输流程
- 浏览器将支持的加密算法信息发送给服务器
- 服务器选择一套浏览器支持的加密算法,以证书的形式回发浏览器
- 浏览器验证证书合法性(在浏览器会有标志显示),(当证书受信以后,web会随机生成一串密码,并使用证书中的公钥加密,之后使用约定好的hash算法握手消息并生成随机数对消息进行加密)并结合证书公钥加密信息发送给服务器
- 服务器使用私钥解密信息,验证哈希,加密响应消息回发浏览器
- 浏览器解密响应消息,并对消息进行验证,之后进行加密交互数据
HTTP和HTTPS的区别
- HTTPS需要到CA申请证书,HTTP不需要
- HTTPS密文传输,HTTP明文传输
- 连接方式不同,HTTPS默认使用443端口,HTTP使用80端口
- HTTPS=HTTP+加密+认证+完整性保护,较HTTP安全
HTTPS真的很安全吗
- 浏览器默认填充http://,请求需要进行跳转,有被劫持的风险
- 可以使用HSTS优化
Socket简介
Socket是对TCP/IP协议的抽象,是操作系统对外开放的接口
Socket通信流程
|