文章目录
- 1.计算机概论
- 1.1 计算机网络是什么?
- 1.2 计算机网络的层次结构
- 2.TCP/IP详解
- 2.1 TCP/IP协议族
- 2.2 网络传输中的数据
- 2.3 网路通信中的地址和端口号
- 2.4 TCP三次握手建立连接
- 2.5 TCP四次挥手建立连接
- 3.网络工具Wireshark和tcpdump
- 4.一次完整的Http请求过程
1.计算机概论
1.1 计算机网络是什么?
利用通信线路将地理上分散的、具有独立功能的计算机系统和通信设备按不同的形式连接起来,以功能完善的网络软件及协议实现资源共享和信息传递的系统。
主要的网络有哪些?
- 局域网
- 城域网
- 广域网
1.2 计算机网络的层次结构
- 应用层(
Http协议
)- 应用层
作用:为应用程序提供服务
- 表示层
作用:数据格式转换、数据加密
- 会话层
作用:建立、管理和维护回话
- 应用层
- 传输层(
TCP
)- 传输层
作用:建立、管理和维护端对端的连接
- 传输层
- 网络层(
IP
)- 网络层
作用:IP选址及路由选择
- 网络层
- 链路层(
网卡、驱动程序
)- 链路层
作用:提供介质访问和链路管理
- 物理层
作用:物理传输
- 链路层
OSI
参考模型分为7
层,而TCP/IP
模型分为4
层
各层之间的关系:
每一个抽象层建立在低一层提供的服务之上,并且为高一层提供服务。
2.TCP/IP详解
2.1 TCP/IP协议族
全称:Transmission Control Protocol/Internet Protocol
概念:中文名为传输控制协议/英特网互联协议,是Internet最基本的协议、Internet国际互联网络协议,由网络层的IP协议和传输层的TCP协议组成。协议采用了4层的层次结构。然后在很多情况下,它是利用IP进行通信时所必须用到的协议群的统称。
TCP/IP概念层模型 | 功能 | TCP/IP协议族 |
---|---|---|
应用层 | 文件传输、电子邮件、文件服务、虚拟终端 | HTTP 、FTP 、DNS 、Talnet、TFTP、SNMP、 |
传输层 | 提供端对端的接口 | TCP 、UDP |
网络层 | 为数据包选择路由 | IP 、ICMP、RIP、OSFP、BGP、IGMP |
链路层 | 以二进制数据形式在物理媒体上传输数据 | ISO2110 、IEEE802 、IEEE802.2 |
2.2 网络传输中的数据
包:
是全能性术语;帧:
用于表示数据链路层中包的单位;片:
是IP中数据的单位;段:
则表示TCP数据流中的信息;消息:
是指应用协议中数据的单位。
从一个应用程序A,传递数据给另外一个应用程序B,会经历如下步骤:
- 程序A
- 应用层,发送数据给程序B
- 传输层,打包TCP包头部信息,得到数据+TCP包首部
- 网络层,打包IP包头部信息,打包得到数据+TCP包首部+IP包首部
- 数据链路层,打包以太网头部信息,得到数据+TCP包首部+IP包首部+以太网包首部
- 物理层,将数据以二进制形式传递给另外一个应用程序
- 程序B
- 物理层,接收到程序A传递过来的二进制数据
- 数据链路层,拆包以太网包首部,得到数据+TCP包首部+IP包首部
- 网络层,拆包IP包首部,得到数据+TCP包首部
- 传输层,拆包TCP包首部,得到数据
- 应用层,得到程序A发送的数据
TCP、UDP和IP
TCP:
- 面向连接的、可靠的流协议
UDP:
- 面向无连接的通讯协议
- 使用场景:QQ、视频直播、音频直播,允许丢包的场景
IP:
- 在源地址和目的地址之间传送的数据包
扩展知识:
移动通信中的4G、5G在哪一层?
答案:在数据链路层。
2.3 网路通信中的地址和端口号
MAC地址:(链路层
)
也可以称为物理地址、局域网地址、以太网地址;MAC地址是写在物理设备内部的。
IP地址:(网络层
)
IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。
端口号:(传输层
)
用来识别同一台计算机中通信的不同应用程序。因此,它也被称为程序地址。
TCP:(传输层
)
面向连接的可靠的协议。
特征:
- 面向连接
- 3次握手
- 可靠性
- 超时重传和应答确认
- RTT(往返延时,Round-Trip Time)和TTO(重传超时,Transmission TimeOut)
- 协调好一个超时重传的时间
- 数据排序
- 保证接收到的数据片顺序正确
- 流量控制
- 通过发送方与接收方进行协商,利用了滑动窗口的作用,实现不会因为发送端发送过于频繁或者数据量过大,导致接收端不能及时处理。
- 全双工
- 发送端发送数据的同时可以作为接收端接收数据,接收端接收数据的同时也可以作为发送端发送数据。
2.4 TCP三次握手建立连接
建立一个TCP连接时,需要客户端与服务端总共发送3个包以确认连接的建立。
- 第一次握手
- 客户端请求建立连接
- 第二次握手
- 服务器应答客户端,并请求建立连接
- 第三次握手
- 客户端针对服务端的请求确认应答
为什么需要3次握手?
TCP是面向连接的,所以需要双方都确认连接的建立。
TCP三次握手详细流程:
- 客户端向服务端发送建立连接的数据包
SYN=1,seq=10086
客户端进入SYN_SENT状态- 服务端接收到客户端发送的数据包,并向客户端发送建立连接的数据包
ACK=1,ack=10087;SYN=1,seq=12345
服务端进入SYN_RCVD状态- 客户端接收到服务端发送的数据包,并向服务端发送响应的数据包
ACK=1,ack=12346
客户端进入ESTABLISHED状态,表示客户端知晓与服务端已建立连接;
服务端在接收到客户端发送来的数据包后,也进入到ESTABLISHED状态,表示服务端知晓与客户端建立连接。至此,客户端与服务端通过发送3次数据包建立起连接,数据包也可以是从服务端开始发送,不过通常情况下是由客户端开始向服务端发送数据包。
扩展知识:
① SYN(synchronous建立连接)
② ACK(acknowledgement确认)
③ PSH(push传送)
④ FIN(finish结束)
⑤ RST(reset重置)
⑥ URG(urgent紧急)
三次握手流程图如下:
TCP3次握手的漏洞-SYN洪泛攻击
定义:
通过网络服务所在的端口发送大量伪造原地址的攻击报文,发送到服务器,造成服务端上的半开连接队列被占满,从而阻止其他用户进行访问。
原理:
攻击者客户端利用伪造的IP地址向服务端发出请求(第一次握手),而服务端的响应(第二次握手)的报文将永远发送不到真实的客户端,服务端在等待客户端的第三次握手(永远都不会有),服务端在等待这种半开的连接过程中消耗了资源,如果有成千上万的这种连接,主机资源将被耗尽,从而达到攻击的目的。
解决方案:
- 无效的连接监控释放
- 延缓TCB分配方法
- 防火墙
2.5 TCP四次挥手建立连接
定义
断开一个TCP连接,需要客户端与服务端总共发送4个包来确认连接的断开。
过程
- 第一次挥手,客户端发送关闭请求
- 第二次挥手,服务端响应客户端关闭请求
- 第三次挥手,服务端发送关闭请求
- 第四次挥手,客户端发送关闭确认请求
为什么需要四次挥手?
TCP是全双工(即客户端与服务端可以相互发送和接收请求),所以需要双方都确认关闭连接。
为什么需要TIME_WAITING状态而不是直接是CLOSED状态,并且需要2分钟左右才变成CLOSED状态?
- 如果当前应用程序占用的端口号没有TIME_WAITING状态,直接进入CLOSED状态,可能存在服务端还有数据包没有向客户端发送完成的情况,如果此时应用程序直接进入CLOSED状态,别的应用程序便可以申请当前应用程序的端口号,且会接收到服务端本应该发送给关闭的应用程序的数据包。
- 如果客户端没有TIME_WATING状态,而是直接进入到CLOSED状态,服务端给客户端发送了数据包后,客户端没有发送数据包响应服务端,间隔一段时间后,服务端会重新给客户端发送数据包,而此时客户端已经关闭了。
TCP四次挥手详细流程:
客户端向服务端发送断开连接的数据包
FIN=1,seq=520
客户端进入FIN_WAIT_1状态服务端接收到客户端发送来的数据包,服务端向客户端发送响应的数据包
ACK=1,ack=521我感觉这里应该是ack而不是seq
服务端进入CLOSE_WAIT状态
客户端收到服务端发送来的数据包,客户端进入FIN_WAIT_2状态服务端再次向客户端发送断开连接的数据包
FIN=1,seq=1314
服务端进入CLOSE状态
客户端接收到服务端发送来的数据包,客户端进入TIME_WAITING状态客户端向服务端发送相应数据包
ACK=1,ack=1315
客户端间隔2分钟左右进入CLOSED状态(2*MSL
)
服务端接收到客户端发送来的数据包后进入CLOSED状态
3.网络工具Wireshark和tcpdump
可以通过第三方工具来查看TCP三次握手和四次分手的具体细节。
4.一次完整的Http请求过程
- 首先进行DNS域名解析(可以通过本地浏览器缓存、操作系统缓存和DNS服务器进行解析)
- 三次握手建立TCP连接
- 客户端发起Http请求(
重复使用
) - 服务器响应Http请求(
重复使用
) - 客户端解析Html代码,并请求Html代码中的资源(
重复使用
) - 客户端渲染展示的内容(
重复使用
) - 关闭TCP连接
DNS劫持和Http劫持
DNS劫持就是在我们通过域名访问进行域名解析的时候,通过入侵我们的路由器或者是劫持DNS服务器,将我们访问的域名对应的ip地址进行篡改后返回,使得我们访问了一个不正确的ip地址。
Http劫持就是当我们在通过Http的域名进行访问的时候,直接对Http域名进行劫持从而导致访问一个错误的网站,或者是对返回的内容进行恶意修改等,比如:插入广告的js代码,导致访问的网站出现广告,目前很多运营商就是通过这种方式对我们访问的网站插入广告。
解决方式:
- 采用Https的域名,因为Https的域名会对请求和响应的报文进行加密,使得不容易对内容进行篡改
- 对请求的url进行加密处理,但是无法解决对响应的数据插入js代码产生广告。