系列目录
参考资料
计算机网络是一个将分散的、具有独立功能的计算机系统,通过通信设备与线路连接起来,由功能完善的软件实现资源共享和信息传递的系统。
功能:数据通信、资源共享、(分布式处理、提高可靠性、负载均衡等)
组成:硬件、软件、协议
功能组成:
OSI模型 | TCP/IP模型 | |
---|---|---|
网络层 | 无连接+面向连接 | 无连接 |
传输层 | 面向连接 | 无连接+面向连接 |
网络层主要任务是把分组从源端传送到目的端,传输单位是数据报。网络的中间节点(通信子网)最高只到网络层。
IP数据报的传输采用网络字节序,即大端模式,低地址存放高位,阅读顺序与人类阅读顺序相同。
IP数据报包括头部和正文两部分,头部由20字节长度的固定部分和可变部分组成,最长为60字节。以下是头部格式:
图中前五行,每行4字节共20字节为固定长度,需要解释的部分含义为:
电路交换
报文交换
分组交换-数据报
分组交换-虚电路
实现从IP地址到MAC地址的映射,即询问目标IP对应的MAC地址。
ARP缓存
用于记录IP地址与MAC地址的映射。
ARP缓存是有生存时间的,结束后会重新发起一轮请求。
ARP请求
ARP欺骗
地址解析协议是建立在网络中各个主机互相信任的基础上的,局域网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存。
由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。
是主机才有的层次,为应用层提供服务,使用网络层的服务。
传输层提供的是进程和进程之间的逻辑通信。
传输层的向应用层提供的SAP是端口,用于标识不同的进程号。
服务端-熟知端口号(0~1023),重要应用程序使用的端口号
FTP 文件传输 |
TELNET 远程登录 |
SMTP 电子邮件 |
DNS 域名解析 |
TFTP 简单文件传输 |
HTTP 超文本传输 |
SNMP 简单网络管理 |
HTTPS |
---|---|---|---|---|---|---|---|
21 | 23 | 25 | 53 | 69 | 80 | 161 | 443 |
无连接的数据报协议
大公司在做通讯工具时往往使用UDP,在应用层自定义协议,实现差错控制等。
面向连接的传输控制协议
为什么不是两次握手?
因为通信是全双工的,要保证双方都至少接收一次ACK后,才确认连接已建立。
如果只有两次握手,那么服务器在收到 SYN 之后就直接进入 ESTABLISHED 状态,可能会出现服务器返回的 ACK 丢失的现象,此时客户端无法进入 ESTABLISHED 状态。
至于为什么不是四次握手,和四次挥手相比较,可以看出是将2、3两步结合在一起,无须多一次握手。
SYN洪泛攻击
攻击者不断发送SYN请求,且不返回确认,服务器会不断重复发送确认信息,消耗资源。
CLOSED :关闭,初始状态。
LISTEN :服务器端的某个SOCKET处于监听状态,可以接受连接了。
SYN_RCVD:这个状态表示接受到了SYN报文。在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,收到客户端的ACK后就结束。
SYN_SENT:与SYN_RCVD类似,SYN_SENT状态表示客户端已发送SYN报文。客户端发出连接后,并等待服务端的发送三次握手中的第2个报文时的状态。
ESTABLISHED :三次握手后双方的状态,表示连接已经建立了。
FIN_WAIT_1:当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态。在实际的正常情况下,无论对方何种情况下,都应该马上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到。
FIN_WAIT_2:客户端等待服务器的FIN。表示半连接,也即有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你,稍后再关闭连接。如果FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。
TIME_WAIT :表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。
CLOSING:双方几乎同时发出FIN报文,属于一种比较罕见的例外状态。正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的ACK报文,再收到对方的FIN报文。
CLOSE_WAIT :当对方发送FIN报文后,己方回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态。如果还有数据发送给对方则继续发送,否则也发送FIN报文给对方,即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。
LAST_ACK:被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。
快速重传
假设此时有1、2、3、4共四个报文要发送,发送方按顺序发送了四个报文,其中2号报文丢失或错误。
接收方接收到1号报文,返回ack=2;
接收方接收到3号报文,返回ack=2;
接收方接收到4号报文,返回ack=2;
接收方会缓存未按序到达的3、4号报文。
发送方收到3个ack=2,认为2号报文丢失,重传2号报文。
超时重传
TCP每发送一个报文段,就会启动一个计时器。当某个ack超时,发送方也认为丢失,重传。
滑动窗口
发送和接收双方都有发送窗口和接收窗口,在发起连接或数据通信时,双方都会根据自己的接收窗口大小和服务器、网络状态,在TCP报头中的窗口字段中赋予合适的值,来调控对方的发送窗口。
例如,当把窗口大小设置为0,则意味着让对方暂停发送消息。
慢开始和快重传
拥塞窗口会根据网络情况动态调整。最开始是指数增大,达到门限值ssthresh后变成线性增大。当网络出现拥塞,如丢包,则减小门限值到当前拥塞窗口的一半,同步调整拥塞窗口。
发送方会根据流量控制的滑动窗口值和拥塞窗口值对自己的发送窗口进行动态调整。
功能:文件传输FTP、电子邮件SMTP,POP3、网页服务HTTP、域名解析DNS
常用模型
客户/服务器模型
P2P模型
使用UDP连接,使用53端口。
包含跟域名服务器、顶级域名服务器、权限域名服务器,按树形层次排列。
一般浏览器在输入网址之后,会现在缓存中查询IP地址,包括:
然后才是迭代地查询各级DNS服务器。
使用TCP连接,适合大文件传输。
连接进程使用21端口,数据传送进程使用20端口。
TFTP协议
简单文件传输协议,基于UDP实现,端口号为69。
开销小,适合进行小文件传输。
详见HTTP协议详解。
使用TCP连接,80端口。
非持久连接:
持久连接:服务器返回资源后,保持连接,以便后续客户机继续请求资源
HTTP报文结构
请求方法主要是POST和GET两种,其中
GET提交的数据存放在URL当中
POST提交的数据存放在请求的报文体当中
HTTP状态码
SPDY协议
SPDY是Speedy的昵音,意为“更快”。它是Google开发的基于TCP协议的应用层协议。目标是优化HTTP协议的性能,通过压缩、多路复用和优先级等技术,缩短网页的加载时间并提高安全性。
SPDY协议的核心思想是尽量减少TCP连接数。SPDY并不是一种用于替代HTTP的协议,而是对HTTP协议的增强。
二进制分帧
在应用层(HTTP)和传输层(TCP)之间增加一个二进制分帧层。
基于文本的方式传输数据存在很多缺陷,文本的表现形式有多样性,因此要做到健壮性考虑的场景必然有很多,但是二进制则不同,只有0和1的组合,因此选择了二进制传输,实现方便且健壮。
在HTTP2.0中引入了新的编码机制,所有传输的数据都会被分割,并采用二进制格式编码。
在二进制分帧层中, HTTP2.0会将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码,其中HTTP1.x的首部信息会被封装到HEADER frame,而相应的Request Body则封装到DATA frame里面。
首部压缩
HTTP2.0使用了HPACK(HTTP2头部压缩算法)压缩格式对传输的header进行编码,减少了header的大小。
在两端维护了索引表,用于记录出现过的header,后面在传输过程中就可以传输已经记录过的header的键名,对端收到数据后就可以通过键名找到对应的值。
多路复用
允许同时通过单一的 HTTP/2 连接发起多重的请求-响应消息。
即用户端同时发送多条请求,服务端也同时响应多条请求。
服务器推送
服务器可以对一个客户端请求发送多个响应。服务器向客户端推送资源无需客户端明确的请求。
比如,当服务器响应页面的时候,会同时推送图片、样式表等内容。
HTTPS 协议是在TCP与HTTP层之间插入了TLS/SSL协议构建的。使用443端口。
HTTPS 相比于 HTTP 具有很好的安全性,但加密需要消耗大量CPU资源,且时延更高。
可进行加密传输、身份认证的网络协议,主要通过数字证书、加密算法、非对称密钥等技术完成互联网数据传输加密,实现互联网传输安全保护。设计目标主要有三个:
数据保密性:保证数据内容在传输的过程中不会被第三方查看。
数据完整性:及时发现被第三方篡改的传输内容。
身份校验安全性:保证数据到达用户期望的目的地。
浏览器首先会解析输入的URL,将其中域名和文件的部分分离,然后根据对域名进行解析,详见:
获取到IP地址之后,浏览器会构建HTTP请求,一般是GET和POST。
如果是HTTPS的请求,还会使用SSL/TSL进行加密,以保证连接的安全。
浏览器会先检查自己的缓存,看是否已经有对应页面的缓存,没有的话会将数据包交给传输层,并构建TCP连接。主要是三次握手过程。
连接建立之后,浏览器从服务器处获取了页面文件,接下来就是对网页的渲染等操作。
评论区