目录
一、OSI开放式互联参考模型
1.物理层 2.数据链路层 3.网络层 4.传输层 5.会话层 6.表示层 7.应用层
二、TCP/IP参考模型
1.应用层 2.传输层 3.网络层 4.数据链路层
三、TCP三次握手
ACK:确认序号标志
SYN:同步序号标志
FIN :释放连接
握手是为了建立连接,可以使用wireshark抓包查看建立连接发送的包的类型以及对应值。
- 第一次握手
Client发送SYN包(假设syn=x)到服务器,并且进入SYN_SEND状态,等待服务器确认收到。 - 第二次握手
Server收到SYN包,发送SYN+ACK包到Client,携带数据ack=x+1(确认已收到syn:x),syn=y。此时服务器进入SYN_RECV(SYN接收)状态。 - 第三次握手
Client收到服务器的SYN+ACK包,向服务器发送ACK包,携带数据ack=y+1(确认已收到syn=y)。
Client方ACK包之后。Client和Server进入Established(已获得确认)状态,完成三次握手。
为什么需要三次握手握手才能建立起连接?发送包的过程中还涉及seq数据的传输,三次握手是为了初始化Sequence Number的值。
首次握手的隐患
问题起因分析:
- Server收到Client的SYN,回复SYN+ACK的之后未收到第三次握手需要Client发送的最后的ACK确认包。
- Server会不断重试发送SYN+ACK包直至超时,Linux默认五次,每次时间倍增,总耗时1+2+4+8+16+32=63s
这个时候可能会出现问题?如果黑客不断向服务器发送请求,但是却不触发第三次握手,就会导致syn序列被大幅占用,导致服务器无法处理正常的业务需求,解决方案 ↓↓↓
针对SYN Flood的防护措施
- SYN队列满后,服务器会通过tcp_syncookies参数回发SYN Cookie
- 若为正常连接,Client会回发SYN Cookie,直至建立连接
建立连接后Client出现故障后怎么办
- 向对方发送保活探测报文,如果未收到则继续发送
- 尝试次数达到保活探测上限数仍未收到回应则终端连接
四、TCP的四次挥手
挥手是为了终止连接,与"三次握手"的目的相反。第一次挥手可以由Client或者Server发起....
- 第一次挥手
Client发送一个FIN包用来关闭Client到Server的数据传输,携带数据seq=x,发送之后自身进入FIN-WAIT-1状态。 - 第二次挥手:
Server收到FIN包之后,发送ACK包给Client,携带参数ack=x+1(确认已收到seq:x),seq=y,自身进入CLOSE-WAIT状态。 - 第三次挥手
Server发送FIN+ACK,用来关闭Server到Client的数据传输,携带数据ack=x+1(同上),seq=z(seq不重复,是唯一标识),Server进入LAST-ACKS状态。 - 第四次挥手
Client收到FIN后,进入FIN-WAIT-2状态;收到FIN+ACK之后,发送一个ACK包给Server,携带数据ack=z+1,seq=x+1,进入TIME-WAIT状态,这个状态会次序2MSL,也就是两个数据包传输时间,确保Server收到发过去的消息。
五、URL键入浏览器,工作流程描述
- DNS解析(将url解析为对应IP地址)
查找过程:
浏览器DNS缓存 → (操作系统DNS缓存 → 操作系统hosts文件)系统DNS缓存 → 本地域名服务器(本地域名服务器迭代寻找)↓↓↓ 依次对下列服务器发起请求(以www.baidu.com为例)
:向根域名服务器发送请求,返回com域的顶级域名服务器的地址
:向com域的顶级域名服务器发送请求,返回baidu.com权限域名服务器的地址
:向baidu.com权限域名服务器发起请求,返回www.baidu.com的IP地址本地域名服务器 将得到的IP地址返回给操作系统,同时自己也将IP地址缓存起来
操作系统将 IP 地址返回给浏览器,同时自己也将IP地址缓存起来
baidu.com -- 顶级域名,只有一个doc分隔符
www.baidu.com ---- 二级域名,两个doc分隔符。所以百度其实是一个二级域名。 -
TCP连接 —— 三次握手
-
发送HTTP请求 —— 涉及POST/GET请求方式,下文有对应解释
-
服务器处理请求并返回HTTP报文
-
浏览器解析解析并渲染页面
-
断开连接 —— 四次挥手
六 、HTTP常用状态码
- 1xx:指示信息——请求已接收,继续处理
- 2xx:成功——请求已成功接收、理解
- 200 OK:正常返回信息
- 3xx:重定向——要完成请求必须进行更进一步的操作
- 4xx:客户端错误——请求有语法错误或请求无法实现
- 401 Unauthorized:请求未经授权
- 403 Forbidden:服务器收到请求,但是拒绝提供服务
- 404 Not Found:请求资源不存在
- 5xx:服务端错误——服务器未能实现合法请求
- 500 Internal Server Error:服务器发生不可预见错误(需查看服务器error.log)
- 503 Server Unavaliable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常
七、POST和GET的区别
- HTTP报文层面:GET请求的参数会直接显示在URL的后面,以&拼接,以key:value形式表示
- 数据库层面:GET请求更多的是对数据库的查找操作,不会对数据库造成修改、损害。POST大多会修改数据库
- 缓存角度:GET请求可以缓存,POST不可以。
HTTP缓存通常只适用于idempotent(幂等性) request(可以理解为查询请求,也就是不更新服务端数据的请求),这也就导致了在HTTP的世界里,一般都是对Get请求做缓存,Post请求很少有缓存。
八、Cookie和Session的区别
- Cookie
- 是由服务器发送给客户端的特殊信息,以文本的形式存放在客户端
- 客户端再次请求的时候,会把Cookie回发
- 服务器收到后,会解析Cookie,生成与客户端相对应的内容
- Session
- 位于服务器内的数据
- Cookie和Session的区别
- Cookie数据存放在客户端,Session存放在服务器
- Session相对于Cookie更加安全
- Session会占用服务器资源,若考虑减轻服务器负担,应当使用Cookie
九、HTTP和HTTPS的区别
- HTTPS需要到CA申请证书,HTTP不需要
- HTTPS密文传输,HTTP明文传输
- 连接方式不同,HTTPS使用443端口,而HTTP使用80端口
- HTTPS=HTTP+加密+认证+完整性保护,相较于HTTP安全