网络基础知识
OSI开发式互联参考模型
- 第一层【物理层】传输比特流。物理设备的标准,数模转换,网卡
- 第二次【数据链路层】物理寻址,同时将原始比特流转变为逻辑传输线路。 定义如何格式数据进行传输,错误检查和纠正。将比特数据组成帧,交换机工作在这一层,将帧解码,根据帧中的信息,把数据发送到接收方。
- 第三层【网络层】控制子网的运行,如逻辑编址、分组传输、路由选择。通讯时经过多个节点,如何找到目标节点,最佳路径?将网络地址翻译成物理地址,将数据从发送方路由到接收方,路由器属于网络层,这层数据称为数据包,需要关注的协议Ip协议
- 第四层【传输层】接受上一层数据,在必要时把数据进行分割,并将这些数据交给网络层,且保证这些数据有效到达对端。需要关注TCP,UDP协议
- 第五层【会话层】建立和管理应用程序之间的通信。自动收发包,寻址
- 第六层【表示层】信息的语法语义以及他们之间的关联。解决不同系统通信的语法问题
- 第七层【应用层】http协议
OSI的实现:TCP/IP四层架构模型
TCP的三次握手
why:ip协议是无连接的通信协议,无法确认包是否按顺序发送,或者包是否被破坏,所以需要由下一层进行控制
报文头:源端口+目的端口+sequence number+acknowledge number+TCPflag
握手是为了建立连接,握手的流程图如下:
为什么需要三次握手才能建立起连接
为了初始化双方的sequence number,作为以后的通讯序号,保证接收到数据乱序
首次握手的隐患–SYN超时
服务器收到客户端的SYN,回复SYN-ACK时客户端掉线,服务端没有收到ACK确认,就会不断重试直到超时,可能遭到SYN Flood攻击。 防护措施:SYN队列满后,通过SYN Cookie,依然可以建立连接
建立连接后,客户端故障怎么办
保活机制:向对方发送探测报文,如果未收到响应则继续发送,达到次数则中断连接
TCP的四次挥手
为什么会有2msl的time_wait的状态
保证有足够时间让对方收到ACK包,避免新旧连接混淆
为什么需要4次挥手
双方都要接收到FIN报文和ACK报文
服务器出现大量CLOSE_WAIT的原因
对方关闭socket连接,我方忙于读或写,没有及时关闭连接
检查代码资源释放,检查线程配置
1 | netstat -n |awk '/^tcp/{++S[$NF]}END{for(a in s) print a,s[a]}' |
UDP
报文结构:源端口+目的端口+数据包长度+checksum+数据
TCP和UDP的区别
- 面向连接 vs 无连接(适合消息多播发布)
- 可靠性(TCP握手,UDP可能丢失)
- 有序性(TCP有序,UDP无序)
- 速度(TCP创建连接,较慢)
- 量级(数据头TCP20字节UDP8字节)
TCP的滑动窗口
TCP的最基础的可靠性来源确认重传机制
发送窗口左边界的数据连续被确认收到,据窗口才可以移动。滑动窗口的大小根据处理能力动态变化
Http协议
1.0->1.1 keep-alive
在浏览器地址栏键入Url,按下回车后经历的流程
- DNS解析(浏览器依据url逐层查询dns缓存解析url对应的ip(浏览器缓存,系统缓存,路由器缓存。。))
- TCP连接
- http请求
- 服务器处理并返回http报文
- 浏览器解析渲染页面
- 释放连接
常见http状态码
1XX 指示信息-请求已接受,继续处理
2XX 成功-请求已成功接收,理解,接收
3XX 重定向-要完成请求必须进一步操作
4XX 客户端错误-请求有语法错误,或者无法实现
400 语法错误,不能理解
401 未授权
403 forbiden
404 notfound
5XX 服务端错误
500 未知错误
503 当前无法处理,连接池满了
Get请求和Post请求的区别
- 报文上看:get请求将请求信息放在url中,post放在报文体中,get长度限制
- 数据库看:get符合幂等性和安全性,post不符合(post会提交数据,post每次请求会添加新资源)
- get可以被缓存,被储存,post不行
cookie和session的区别
解决http请求的无状态
Cookie是客户端的解决方式
session
区别