文章目录
所谓的计算机网络就是一个大的 协议规则,用户通过这些协议将用户数据传递到实际的物理链路上进行传输,到达指定的地址后,再进行一层层的协议解析获得用户的数据。
一、计算机网络体系结构
计算机网络是计算机相互连接的基础,是一组组定义的不同设备与层之间的协议。不同的标准对网络体系结构的定义是不同的:
② 运输层 :两台主机中,进程间的通信的 通用数据传输服务。运输层协议主要有两种:
TCP
(Transmission Control Protocol)传输控制协议 -面向连接的可靠的数据报文段。
UDP
(User Datagram Protocol)用户数据报协议-无连接的最大努力交付的用户数据报。
③ 网络层(IP层):把运输层缠身的报文段或用户数据报封装成 分组(IP数据报)或包进行传送,同时选择合适的路由,使运输层传输下来的分组能够通过路由器找到目的主机。
④ 链路层: 将网络层的IP数据报组装成帧,每一帧包括数据和必要的控制信息。
⑤ 物理层:实际的传输线路,按0,1比特位发送。
在实际的互联网的应用中常用的是TCP/IP体系结构,如下图所示:
二、网络层
网络层实现了数据包的选路和转发。在两个主机通信时,不是直接相连的,而是通过多个中间结点(路由器)连接的。网络层的任务就是针对目标IP地址
,选择这些中间节点,确定两个主机之间的通信路径,选择合适的路由,使运输层传输下来的分组能够通过路由器找到目的主机。在网络层存在4个主要的协议:
① 网际IP协议
② 地址解析协议ARP(Address Resolution Protocol)
③ 网际控制报文协议ICMP(Internet Control Message Protocol)
④ 网际组管理协议IGMP(Internet Group Management Protocol)
2.1 IP协议
IP协议是网络层的基础,它对上层协议提供无状态,无连接,不可靠的服务。
① 无状态: IP通信双方不同步传输数据的状态信息,所有的IP数据报的发送,传输和接收都是相互独立,没有上下文关系的。因此,IP协议无法处理乱序和重复的IP数据报,同时由于无状态,IP协议无需分配内核资源,从而简单高效。
② 无连接:IP通信双方都不长久维持对方的任何信息。因此,每次发送数据时,都要明确指定对方的IP地址。
③ 不可靠:IP协议不能保证IP数据报准确地到达接收端。
它对下层(数据链路层)组成的单个子网,形成了一个整体的虚拟互联网络。IP层抽象的互联网只能看到数据报。IP协议根据数据包的目的IP地址决定如何投递到目的地址。
💗 2.1.1 IP数据报
IP数据报是数据传输的基础,其格式如下图所示:
当IP数据报的长度超过帧的MTU时,就会被分片传输。 IP数据报的分片利用数据报标识,标志和片位移三个字段信息来完成。以太网帧的MTU为1500字节,因此IP数据报的数据部分最多为1480字节(IP数据报头部为20字节)。一个IP数据报的每个分片都有自己的IP头部,具有相同的标识值,但具有不同的片位移。
💗 2.1.2 IP地址及划分
IP协议的基础是IP地址。一个IP地址在整个互联网范围内是唯一的。
1. 常用IP分类
IP地址分为5个类型:A类、B类,C类,D类,E类。IP分类的目的是为了路由器的选路(网络号)更加简单。通过判断IP地址的首位,第二位,第三位就能快速分清IP地址属于哪一类。
2. 无分类地址CIDR
CIDR没有地址分类的概念,其将32位IPv4地址分为两部分:网络号+主机号。表现形式为 a.b.c.d/x
,其中x表示前x位属于网络号。
子网掩码就是通过按位与的方式掩盖掉主机号,即
网络号 = 子网掩码 AND IP地址
在数据的传输过程中,目的地址和源地址之间可能存在多个 路由器的转发,在每个路由器当中,存在一个路由表, 用于保存与所有网络的目的地址和到达其目的地址的下一跳地址。
2.2 地址解析协议 ARP
ARP协议能实现任意网络层地址到任意物理地址的转换,已知IP地址求MAC地址。
为了解决网络中主机更改带来的网络改变问题,ARP协议通常在主机ARP高速缓存中存放一个从IP地址到硬件地址的映射表,并且这个映射表必须进行动态更新。ARP映射表的更新过程如下图:
2.3 ICMP 协议
💗 2.3.1 ICMP介绍
ICMP全称为:网际控制报文协议,用于主机与路由器报告差错情况,并提供有关异常情况的报告,检测网络连接。ICMP报文作为IP层数据报的数据,加上数据报的首部,组成IP数据报发送出去。ICMP报文格式如下所示:
ICMP报文有两个种类: ICMP差错报告报文,ICMP询问报文。在
PING
应用中使用的是回送(ECHO)请求。如下所示:
💗 2.3.2 PING 的原理
PING
是基于ICMP
协议工作的,利用ICMP
的查询报文类型中类型0(回送应答)或类型8(回送请求)。PING
的请求过程如下图所示:
2.4 动态获取IP - DHCP
利用DHCP协议,能够进行动态获取IP地址,省去了配置IP地址的过程。其自动分配IP的过程如下图所示:
三、运输层
运输层为应用进程之间提供端到端的逻辑通信,同时对接收的数据报文进行差错检测。运输层分为两种协议:① 面向连接的传输控制协议TCP;② 无连接的用户数据报协议UDP。
3.1 用户数据报协议UDP
UDP协议主要特点如下:
① UDP是无连接的;
② UDP是最大努力交付,即不保证可靠交付,所以UDP没有发送缓冲区,UDP内核不会为应用层数据保存副本;
③ UDP是面向报文的,发送端每执行一次写操作,接收端必须执行读操作,否则就会丢包。
④ UDP没有 拥塞控制;
⑤ UDP支持 一对一,一对多,多对一和多对多通信;
⑥ UDP的 首部开销小
UDP的数据格式如下图所示:
3.2 传输控制协议TCP
Q1. 为什么需要TCP协议?
因为TCP的下一层IP层是不可靠的,它不保证数据的可靠交付,按序交付,也不保证数据的完整性。如果需要保证网络数据包的可靠性,就必须使用TCP协议。
Q2. 什么是TCP,TCP的特点?
TCP是面向连接的,可靠的,基于字节流的传输层通信协议。其特点如下:
① TCP是面向连接的,其连接是一条虚连接。每条TCP只能是一对一的,无法一对多。所以,基于广播和多播的应用程序不能使用TCP服务。
② TCP提供的是可靠交付服务,数据无差错,不丢失,不重复,且按序达到。
③ TCP是面向字节流的,应用程序对数据的发送和接收是没有边界限制的,多大的数据都可以进行传输,且顺序是有序的。
💗 3.2.1 TCP报文格式
TCP的报文段分为首部和数据两个部分,TCP的全部功能体现在首部各字段的作用。
在首部各字段中,序列号,确认应答号最为重要。
① 序列号 ISN: 序列号用来解决网络包乱序问题。在建立连接时,有计算机生成的随机数作为初始值,通过SYN包传给接收端,每发送一次数据就加1。
② 确认应答号 ACK:确认应答号用来解决不丢包问题。是指下一次期望收到的数据的序列号,发送端收到这个确认应答后可以认为这个序号以前的数据都被正常接收。
③ 检验和:为了发现TCP首部和数据在发送端到接收端之间发生的任何改动。TCP首部检验和=TCP首部+TCP数据+TCP伪首部
。
● 发送端:首先把TCP伪首部,首部和数据分成16位的字,如果长度为奇数个字节,则添加一位0,并把TCP报头的校验和字段置为0。然后用反码相加法(对每16bit进行二进制反码求和)累加所有16位字,当有进位时,将高位叠加到低位。最后将计算结果作为TCP校验和中。
● 接收端:将所有原码相加,高位叠加低位,如果结果的16位都为1则正确,否则说明发送错误。
Q1. 数据在IP层会分片,为什么TCP还需要MSS?
首先MTU与MSS的关系如下:
当网络包的大小超过
MTU
时,IP层就会对网络包进行分片,但IP层是不可靠的,其分片可能会在网络上丢失。当服务端收到缺失的网络包时,不会返回信息到客户端,客户端超时重传整个TCP数据包、设立
MSS<MTU
,使数据超过
MSS
时,TCP会对数据包进行分片,而不会通过IP进行分片。由于TCP可靠性,当数据缺失时,可以对缺失的分片进行重传,提高效率。
💗 3.2.3 TCP的报文封装
经过TCP封装后的数据称为TCP报文段,TCP协议为通信双方维持一个连接,并在内核中存储相关数据。因此,TCP的头部信息+TCP内核缓冲区数据=TCP报文段
,数据包大小=TCP报文段+IP头部=TCP头部+IP头部+TCP数据部分
💗 3.2.4 TCP控制参数
💗 3.2.5 TCP运输连接管理
TCP运输连接有三个阶段:连接建立,数据传送,连接释放。在下面介绍中,都是以客户端作为主动连接方和主动断开方,而在TCP实际连接过程中,其状态是依据主动连接方和主动断开方而进行改变的。
1. 连接建立
TCP连接的建立采用三次握手方式,在第三次握手时是可以携带数据的,前两次握手是不可以携带数据的。TCP进行握手初始化连接的目的是:分配资源,初始化序列号,知道初始化连接的目标。
Q1. 如何理解TCP的连接?
TCP通过序列号和应答号可以保证数据的关联性和确定性。利用TCP的全双工通信,通过建立双向确认机制使得TCP建立了一条“虚连接”线路。
通过源地址,源端口,目的地址,目的端口,可以唯一的确定一个TCP连接。
Q2. TCP的最大连接数是多少?
理论上来说,
TCP的最大连接数=客户端的IP数×客户端的端口数
,对于IPv4,客户端的IP数最多为
2
32
2^{32}
232,客户端的最大端口数为
2
16
2^{16}
216 ,所以最大连接数为
2
48
2^{48}
248。
但是实际的TCP连接数会受到文件描述符和内存大小的限制。
Q3. TCP为什么要三次握手?
① 三次握手可以防止旧的重复连接初始化造成混乱。因为网络是不稳定的,客户端连续发送多次
SYN
建立连接的报文,在网络拥堵等情况下,客户端第一次发送的连接请求没有收到服务端确认,会超时重传。此时旧的请求数据包已经失效。如果是两次握手,服务器就无法判断是否是历史连接 。三次握手时,客户端收到服务器的确认后,可以根据上下文判断是否是历史连接,如果是,则发送
RST
报文终止此次连接。
② 同步双方的初始序列号。如果是两次握手只能保证客户端一方的初始序列号能被对方成功接收,没办法保证服务器端的初始序列号被客户端接收。
③ 避免资源浪费。两次握手在消息滞留情况下,服务器重复接受无用的连接请求
SYN
报文,而造成重复分配资源。
Q4. 为什么初始序列号ISN不同,能否将ISN固定,如何产生的?
网络中的报文会延迟、会复制重发、也有可能丢失。为了避免报文的延迟,重发互相影响,客户端和服务端的初始序列号是随机且不同的。同时,如果固定ISN很容易让攻击者猜测到TCP连接的ISN。在RFC793 中,建议 ISN 和一个假的时钟绑在一起,这个时钟会在每 4 微秒对 ISN 做加一操作,直到超过 2^32,又从 0 开始,这需要 4 小时才会产生 ISN 的回绕问题,保证了每个新连接的 ISN 不会和旧的连接的 ISN 产生冲突。因此,
ISN
是基于时钟产生的,
ISN=计时器+Hash算法
。
Q5. 什么是TCP半连接队列和全连接队列 ?
半连接队列(
SYN队列
):服务端收到客户端的SYN请求后,内核将该连接存储到
SYN队列
,并响应
SYN+ACK
。
当服务端并发处理大量请求时,如果TCP的SYN队列
很小,就容易发生溢出,导致后续的请求被丢弃,出现服务端请求数量上不去的情况。
全连接队列(
Accept队列
):服务端收到第三次握手的
ACK
后,内核将连接从
SYN队列
移除,并创建新的完全连接,添加到
Accept队列
,等待进程调用
accept()
函数取出连接。
Q6. TCP初始化连接SYN超时问题 ?
当客户端Client发送SYN包给服务端Server后挂了,Server返回给Client的
SYN-ACK
没有收到Client的ACK确认,此时连接既没有建立,也不算连接失败。这时就需要设置一个超时时间让Server断开连接。Linux 下默认会进行 5 次重发
SYN-ACK
包,重试的间隔时间从 1s 开始,5 次的重试时间间隔为 1s,2s, 4s, 8s,16s,总共 31s,第 5 次发出后还要等 32s 都知道第 5 次也超时了,所以,总共需要 1s + 2s +4s+ 8s+ 16s + 32s =63s,TCP 才会把断开这个连接。由于,SYN 超时需要 63 秒,那么就给攻击者一个攻击服务器的机会,攻击者在短时间内发送大量的 SYN 包给Server(俗称 SYN flood 攻击),用于耗尽 Server 的 SYN 队列。
Q7. 什么是SYN攻击,如何避免?
;什么是SYN攻击:
当攻击者在短时间(63s内)伪造不同的IP地址的SYN报文,服务端每接收一个报文就会进入SYN_RCVD
状态,并加入SYN接收队列,但是返回的ACK+SYN
报文无法得到伪造IP主机的ACK应答,从而导致服务端SYN接收队列占满,是服务器不能正常接收用户服务。
如何避免SYN攻击:
① 增大SYN队列:
修改内核参数tcp_max_syn_backlog
,同时增大somaxconn
和backlog
(Accept()队列
)`
echo > 1024 /proc/sys/net/ipv4/tcp_max_syn_backlog #增大tcp_max_syn_backlog
echo > 1024 /proc/sys/net/core/somaxconn #增大somaxconn
② 开启 tcp_syncookies
功能:
echo 1 > /proc/sys/net/ipv4/tcp_syncookies #仅当SYN队列放不下时,再启用
③ 减少SYN+ACK
重传次数
当服务端受到 SYN 攻击时,就会有大量处于 SYN_REVC
状态的 TCP 连接,处于这个状态的 TCP 会
重传 SYN+ACK
,当重传超过次数达到上限后,就会断开连接。
echo 1 > /proc/sys/net/ipv4/tcp_synack_retries # SYN+ACK 重传次数上限设置为 1
2. 连接释放
TCP连接的释放采用四次挥手方式,TCP进行断开连接的目的是:回收资源,终止数据传输。
TCP主动关闭连接的那一方会最后进入
TIME-WAIT
,因此,如果客户端主动关闭,则客户端就会出现TIME-WAIT状态,如果服务端主动关闭,则服务端就会出现
TIME-WAIT
。在TCP断开连接时分为3个过程:
● 过程一:主动关闭方发送 FIN;
● 过程二:被动关闭方收到主动关闭方的
FIN
后发送该 FIN 的
ACK
,被动关闭方发送
FIN
;
● 过程三:主动关闭方收到被动关闭方的
FIN
后发送该 FIN 的
ACK
,被动关闭方等待自己 FIN 的
ACK
;
由于TCP的协议标准要求, 不对
ACK
报文进行ACK
,因此在过程三中,被动关闭方无法对主动关闭方的ACK报文进行回应。如果没有
TIME-WATI
状态,当主动发送方发送
ACK
报文后进入
CLOSED
状态,由于网络问题,
ACK
报文丢失,此时就会造成主动发送方关闭,而被动发送方无法关闭的问题。因此主动关闭方需要进入
TIME-WAIT
状态,保证
ACK
报文被被动关闭方接受。
综上所述:
TIME-WAIT
的作用如下:
① 为了保证客户A发送的最后一个ACK报文段能够到达服务器B,若服务器B未收到,则客户A重传一次。
② 使本连接持续的时间内产生的所有报文段从网络上消失。防止具有相同端口的TCP连接被再次复用后,收到上次连接结束时,由于网络延迟的过期的报文。
Q9. TCP 两端同时断开时会怎么样 ?
TCP Server,Client两端同时发起 FIN 包进行断开连接,那么两端可能出现完全一样的状态转移
FIN-WAIT-1 -> CLOSEING -> TIME-WAIT
,也就会 Client 和 Server 最后同时进入
TIME-WAIT
状态。
Q10. TIME_WAIT 会带来哪些问题 ?
① 作为服务器,短时间内关闭了大量的Client连接,就会造成服务器上出现大量的TIME-WAIT
连接,占据大量的tuple(源IP地址、目的IP地址、源端口、目的端口)
,严重消耗着服务器的资源。
② 作为客户端,短时间内大量的短连接,会大量消耗的Client机器的端口,毕竟端口只有 65535 个,端口被耗尽了,后续就无法在发起新的连接了。
因此,由于上面的问题,当作为客户端需要连本机的一个服务的时候,首选 UNIX 域套接字而不是TCP。
Q11.如何解决TIME-WAIT带来的问题,如何解决大量连接处于TIME-WAIT问题 ?
① TIME-WAIT
快速回收 (tcp_tw_recycle
):
在Linux中,实现了一个TIME-WAIT
状态快速回收的机制,可以通过设置参数tcp_tw_recycle
和tcp_timestamps
(默认打开)来实现。
vi /etc/sysctl.conf
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
Linux下快速回收的时间为RTO < 2MSL
,当TIME-WAIT
状态释放了之后,该连接的tuple(源IP地址、目的IP地址、源端口、目的端口)
元素信息就都没有了,而此时,新建立的TCP却面临着危险:
● 危险1:新的连接可能被网络延迟的FIN
包终止。
● 危险2:新的连接被旧的连接劫持
这些危险是因为旧的连接没有完全关闭,而此时具有相同IP的连接进行连接而导致的,为了避免这些危险,当新的连接同时满足以下三种情况时就要拒绝连接,如果这3种情况同时发生则说明是旧的重复数据包:
1. 来自同一台机器的TCP连接携带时间戳;
2. 之前同一台 peer 机器(仅仅识别 IP 地址,因为tuple元素信息
被快速释放了,没了端口信息)的某个 TCP 数据在MSL秒之内到过本Server;
3. 新连接的时间戳小于peer机器上次TCP到来时的时间戳,且差值大于重放窗口戳。
对于上面的三种情况,单独的机器不会受到影响,因为单台机器的时间戳不能倒流,一定是不同的。但是,如果网络中涉及NAT设备时,就很可能出现这种情况,因为NAT设备将数据包的源IP地址都改成了一个地址(或者少量的IP地址),但是却基本上不修改TCP包的时间戳。因此当存在NAT设备时要尽量关闭TIME-WAIT
快速回收。
② TIME-WAIT 重用 (tcp_tw_reuse
):
当同时开启tcp_tw_reuse
选项和 tcp_timestamps
选项可以开启 TIME-WAIT
重用,TIME-WAIT
重用虽然没有解决大量TIME-WAIT状态导致资源的消耗,但是解决了整机范围拒绝接入的问题。只要满足以下两点中其中一点,TIME-WAIT状态的tuple信息可以重新被新来的SYN连接使用:
1.新连接 SYN 告知的初始序列号比 TIME-WAIT 旧连接的末序列号大
2.新到来的连接的时间戳比旧连接的时间戳大。
net.ipv4.tcp_tw_reuse = 1
Q12. 为什么TIME_WAIT=2MSL ?
MSL
是报文最大生存时间,超过这个时间报文被丢弃,对于恰好使用1MSL的时间的报文称为极限报文。TIME-WAIT=2MSL
的原理如下:
Q12. 如何优化TIME_WAIT ?
在程序中对socket设置
SO_LINGER
,当调用
close()
后,会立刻发送一个
RST
,使TCP跳过四次挥手,直接关闭。
struct linger so_linger;
so_linger.l_onoff = 1;
so_linger.l_linger = 0;
setsockopt(s, SOL_SOCKET, SO_LINGER, &so_linger,sizeof(so_linger));
💗 3.2.6 TCP 重传机制
TCP实现可靠传输的方式之一,是通过序列号+确认应答
实现的。但在较为复杂的网络环境下,数据会在传输中丢失,针对数据包丢失的问题,TCP采用重传机制解决。常见的重传机制有:超时重传,快速重传,SACK,D-SACK。
1. 超时重传
超时重传以时间为驱动。在发送数据时,设置一个定时器,当超过指定时间后,没有收到对方的ACK
确认应答报文,就会重发该数据。当TCP传输中数据包丢失或确认应答丢失的时候会触发超时重传。
2. 快速重传
快速重传机制不以时间为驱动,而是以数据驱动进行重传。当发送端收到三个相同的
ACK
报文时,会在定时器过期之前,重传丢失的报文段。快速重传机制如下图所示:
3. SACK 与 D-SACK
标准的TCP确认机制中,如果发送方发送了0-1000序号之间的数据,接收方收到了0-100、300-1000,那么接收方只能向发送方确认101,这时发送方会重传所有101-1000之间的数据,实际上这是不必要的,因为有可能仅仅是丢了一小段而已,但是在标准的TCP确认机制中,发送方无法感知这一事情,只能重传从101开始的所有数据。
SACK
重传是选择性确认,该机制在TCP头部字段中添加
SACK
字段,用来将缓存地图发送给发送方,当中间缺失时,只重发缺失段数据就行。
D-SACK
是利用SACK
来告诉发送方有哪些数据被重复接收了。
💗 3.2.7 TCP流量控制(滑动窗口)
Q1. 什么是流量控制?
对发送方发送速率的控制,称之为流量控制
双方在通信的时候,发送方的速率与接收方的速率是不一定相等。如果发送方的发送速率太快,导致接收方处理不过来,接收方就会将数据放入缓存区(窗口)中。但当缓存区(窗口)满了,接收方就会将收到的数据包丢掉。因此需要控制发送方的发送速率。
Q2. 如何进行流量控制?
接收方收到数据包,向发送方发送确认报文时,告诉发送方自己缓冲区剩余空间的大小(接收窗口大小),发送方根据窗口大小调整自己的发送窗口大小,当发送方收到接收窗口的大小为0时,发送方就会停止发送数据。
通过利用滑动窗口可以进行流量控制,发送方收到一个确认,就把发送窗口向前移动一个分组。滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据,发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据。
Q3. 停止发送数据后何时再继续发送数据?
当窗口关闭后,由于服务端是通过ACK来发送通告窗口大小的,当网络不稳定时,会导致服务端发送的通告窗口大小的ACK报文丢失,此时服务端会一直等待客户端数据,但客户端一直等待非0窗口大小通知,从而导致 死锁。 为了避免死锁的产生,设定了定时探测的方式:当发送方停止发送报文时,开启一个定时器,每隔一段时间就向接收方发送测试报文,询问是否可以继续发送数据。如果可以,接收方就告诉他此时接受窗口的大小;如果接受窗口大小还是为0,则发送方再次刷新启动定时器。
Q4.什么是糊涂窗口综合征,如何解决 ?
● 糊涂窗口综合征:
当服务端很忙,不能及时取走接收窗口的数据,会导致客户端的发送窗口越来越小。到最后,当客户端取走几个字节数据并告诉客户端现在有几个字节的窗口,而客户端会马上发送这几个字节。由于
TCP+IP
协议头部有40个字节,因此几个字节的小数据频繁传输会造成很大的开销。糊涂窗口综合征产生原因是:① 服务端接收方可以向客户端通告一个小窗口;② 客户端发送方可以发送小数据。
● 糊涂窗口综合征的解决:
① 让接收方不通告小窗口:
当
服务端窗口大小<min(MSS,缓存空间/2)
时,向客户端通告窗口为0,阻止客户端发送方发送数据。
② 让发送方避免发送小数据:
使用
Nagle
算法,当满足两个条件中的一条时才可以发送数据:
(1). 等到
窗口大小≥MSS || 数据大小≥MSS
(2). 收到之前发送数据的
ACK
回包。
💗 3.2.8 ARQ协议
基于重传机制和滑动窗口机制,提出了
ARQ
协议,来保证TCP数据的可靠传输。ARQ协议包括“
停止等待ARQ协议”和“
连续ARQ协议”
💗 3.2.9 TCP拥塞控制
TCP的流量控制负责的客户端与服务器之间两端,并没有考虑网络中出现的问题。拥塞控制负责的是创造一个良好的网络空间环境。
Q1. 什么是拥塞及拥塞控制?
当网络中某一资源的需求超过了该资源所能提供的可用部分时,网络的性能就会变坏,这种情况称为 拥塞。
拥塞控制就是防止过多的数据进入网络中,防止数据链路过载。拥塞控制是一个全局性过程,涉及到网络中所有的主机,路由器等资源。
Q2. 拥塞控制的方法?
为了避免大量的数据进入网络,在发送方维持一个拥塞窗口(CWND,Congesion Window)的变量,拥塞窗口的大小取决于网络的拥塞程度,并动态的变化。
拥塞控制有4种方法:慢开始,拥塞避免,快重传,快恢复
① 慢开始:慢开始是指不要在一开始发送大量数据,而是由小到大的逐渐增加拥塞窗口的大小。(如,当发送方每收到一个确认就把
CWND
大小
增加一倍)。为了防止
CWND
增长过大引起网络拥塞,还需设置一个
慢开始门限ssthresh
状态变量,其关系如下:
– 当
CWND<ssthresh
时,使用慢开始算法。– 当
CWND>ssthresh
时,使用拥塞避免算法。– 当
CWND=ssthresh
时,任意使用慢开始与拥塞避免。
② 拥塞避免算法:拥塞避免算法让拥塞窗口
CWDN
缓慢增长。(如:当发送方每收到一个确认就把
CWND
大小
增加1)。当出现网络拥塞时,就将
慢开始门限ssthresh
设置为出现拥塞时的发送窗口大小的一半,然后把拥塞窗口设置为1,执行慢开始算法。
ssthresh
门限减半,但不执行慢开始算法,直接执行拥塞避免算法,这是当发送方到收到连续的三个重复确认时,网络没有出现拥塞(拥塞时,发送方无法收到重复确认)
四、安全套接字层 SSL/TLS协议
随着网络发展,网络安全成为需要关注的问题,为了保证数据的安全,在传输层与应用层之间添加了安全套接字层SSL
。SSL
通过互相认证,使用数字签名确保完整性,使用加密确保私密性,实现客户端与服务端之间的安全通讯。
4.1 SSL 协议
SSL
分为两层:
● SSL
记录协议(SSL Record Protocol
):建立在可靠传输协议之上,为高层协议提供数据封装,压缩,加密等基本功能支持。
● SSL
握手协议(SSL Handshake Protocol
):建立在SSL
记录协议之上,用于在实际数据传输之前,对通讯双方进行身份认证,协商加密算法,交换加密密钥等。
4.2 TLS协议
TLS
协议是在SSL
协议标准化后的产物,TLS
称为安全传输层协议。TLS
可以用于两个通信应用之间提供保密性和数据完整性。TLS
协议由两层组成:TLS
记录协议和TLS
握手协议。
TLS
协议与SSL
协议之间是并行的关系。其主要的区别如下:
四、应用层
应用层协议是通过位于不同主机中的多个应用进程之间的通信和协同工作来完成的。应用层协议大多是基于客户服务器方式,即客户程序和服务器程序。客户是服务请求方,服务器是服务提供方。
4.1 域名DNS协议
DNS是互联网的命名系统,用来将机器名字转换为IP地址。 域名只是一个逻辑概念,不代表计算机的物理地址。DNS服务器解析过程如下图所示:
4.2 文件传送协议FTP
文件传送协议是文件共享协议中的一类,其目的是将文件从一台计算机中复制到另一台计算机中。其特点是:通过复制整个文件,然后再进行文件的存取和修改。文件传送协议分为:① 基于TCP的FTP;②基于UDP的简单文件传送协议TFTP。由于不同的计算机有着不同的文件系统,所以FTP的主要功能是减少或消除在不同操作系统下处理文件的不兼容性。
4.3 万维网 www
万维网是一个大规模的联机式的信息储藏所,简称Web。万维网是一个分布式的超媒体系统,是超文本系统的扩充(一个超文本是由多个信息源链接而成)。 万维网以客户服务器方式工作,客户程序(浏览器)向服务器程序发出请求,服务器程序向客户程序送回客户所要的万维网文档。为了能准确的在互联网上查找到需要的文档,针对几个问题提出了解决方法:
(1) 标志互联网上的万维网文档? — 统一资源定位符URL
(2) 实现万维网上各种链接? — 超文本传送协议HTTP
/超文本传输安全协议HTTPS
(3) 创作不同风格的万维网文档? — 超文本文档 Html
(4) 针对Http的无状态,如何实现对客户信息的识别? — Cookie
/ Session
技术
💗 4.3.1 统一资源定位符-URL
URL
是与互联网相连的机器上的任何可访问对象的一个指针。 URL
用来表示从互联网上得到的资源位置和访问这些资源的方法。URL
的一般形式由五个部分组成:
② 主机:万维网文档存放在哪台主机上,是指主机在互联网上的域名。
③ 端口:用于和主机通信的端口号。http的默认端口号是80。
④ 路径:万维网文档在主机中的存放路径。
⑤ 参数:向服务器传输的参数。
💗 4.3.2 超文本传送协议-HTTP
HTTP是面向事务的应用层协议。 Http报文都使用TCP连接传送。Http的特点如下:
① 虽然Http使用TCP连接传送,但 Http协议本身是无连接的,在通信的双方交换Http报文之前不需要建立Http连接,但是要建立TCP的连接。
② Http是无状态的,同一个客户第二次访问同一个服务器的页面时,服务器响应与第一次被访问时相同。
③ Http协议常用的端口号为80
。
④ Http协议传输数据以明文形式显示。
1. Http 协议类型
● Http/1.0 协议:采用非持续连接方式,即每次请求就会重新建立TCP连接,开销过大。
● Http/1.1 协议:采用持续连接,每次请求和响应后仍保持客户端与服务器端一段时间的连接。在Http/1.1 协议中又有两种工作方式:非流水线方式和流水线方式。
非流水线方式:客户端在收到前一个响应之后才能发出下一次的请求。
流水线方式:客户端在收到前一个Http响应之前能够发送新的请求报文。
2. Http 请求报文结构
HTTP请求报文的结构如下图所示:
① 请求行:请求行由请求方法,URL和HTTP版本协议组成。
● HTTP定义的请求方法有8种,如下所示:
② 请求头部:请求头部为请求报文添加了一些附加信息,由“名:值”对组成,每行一对,名和值之间使用冒号分隔。请求头部的最后会有一个空行,表示请求头部结束。
3. HTTP 响应报文结构
HTTP响应报文的结构如下图所示:
① 状态码:
💗 4.3.3 超文本传输安全协议-HTTPs
HTTPs
协议是以安全为目标的HTTP
通道,HTTPs
协议需要申请CA证书,在HTTP
协议的基础上加入了SSL(Secure Sockets Layer安全套接层)
,即Https=Http+SSL
,通过传输加密和身份认证保证了传输的安全性*。HTTPs
使用443端口。
①
HTTP
是超文本传输协议,信息是明文传输;
HTTPs
是具有安全性的SSL安全传输协议。
②
HTTP
与
HTTPs
的连接方式不同,
HTTP
协议在TCP连接后便可进行
HTTP
报文传输;
HTTPs
协议在TCP连接后还需要进行SSL/TLS握手过程,才能进行加密报文传输。
③
HTTP
与
HTTPs
对应的端口也不同。
HTTP
的端口为80,
HTTPs
的端口为443。
Q2. HTTPs协议相对于HTTP协议的改进方面 ?
在说明改进之前首先说一下HTTP协议的缺陷:
HTTP是明文传输,因此存在三个缺陷:① 窃听风险;② 篡改风险;③ 冒充风险。HTTPs的改进下图所示:
Https协议分为两个阶段:证书验证阶段和数据传输阶段。在证书验证阶段是非对称加密,而在数据传输阶段是对称加密。其原理就是:首先利用公钥,通过数字证书来验证身份,让生成随机密码串作为密钥,通过对称密钥机制进行数据的加密传输。具体的过程如下:
💗 4.3.4 超文本文档-HTML
HTML分为静态文档,动态文档和活动文档三种方式。
(1).静态文档:利用HTML语言来实现具体的文档,是最基础的超文本文档,但静态文档不的内容不会动态改变。
(2).动态文档:动态文档是指文档的内容在浏览器访问服务器时才由程序创建。当浏览器请求到达时,服务器运行另一个应用程序(CGI程序,通用网关接口),并把控制转移到此应用程序,应用程序对浏览器发来的数据进行处理,服务器将应用程序输出的HTTP格式文字作为响应报文。
(3).活动Html文档(用于浏览器屏幕显示的连续更新):动态文档一旦建立,它所包含的信息内容也就固定下来,无法及时刷新屏幕。分为两种方式:① 服务器推送;② 活动文档
💗 4.3.5 Cookie / Session - 客户信息的识别(状态保持)
由于Http是无状态的,也就说明Http服务器是无法记录客户信息的。但是一些站点通常需要对客户进行识别(如,网购的购物列表等),这就需要Cookie / Session来根据和记录用户信息。
1. Cookie技术
Cookie用来表示在Http服务器和客户之间传递的状态信息。 Cookie是记录在客户端的。
Cookie工作流程:
2. Session技术
Session与Cookie的功能作用是相同的。 Session与Cookie的区别是Session记录在服务器端的。 服务器使用一种类似于散列表的结构来保存信息。
Session有两种实现方式:① 通过Cookie实现;② 通过URL重写来实现。
(1).通过Cookie来实现
(2).通过URL地址重写来实现
URL地址重写方法是对 客户端不支持Cookie的解决方案。URL地址重写的原理: 将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的id。
💗 4.3.6 HTTP 代理服务器
代理服务器分为三种:正向代理服务器,反向代理服务器和透明代理服务器。
① 正向代理服务器
正向代理服务器是设置在客户端,客户的每次请求都发送到正向代理服务器上,并与代理服务器请求目标资源。这种代理服务器常用于防火墙内的局域网,可以用来屏蔽网站。
② 反向代理服务器
反向代理服务器设置在服务器端,用于接收客户端请求,并将请求转发给内部网络上的服务器,并将内部服务器的结果返回给客户端。
③ 透明代理服务器
透明代理只能设置在网关上,且该代理对用户来说是透明的。透明代理是正向代理的一种特殊情况。
💗 4.3.7 实例1:通过代理服务器访问Web服务器
下面展示了主机通过代理服务器访问Web服务器的过程。
4.4 应用进程的网络通信
应用层中常用的协议及其运输层协议如下图所示:
应用进程的网络通信主要是通过 套接字接口来实现。如下图, 套接字以上的进程由应用程序控制,套接字以下的运输层协议由操作系统控制。
通常,一个服务器必须能够同时处理多个连接,即并发方式工作。并发方式需要通过套接字来区分不同的客户的连接,并创建从属服务器进程进行数据处理。
五、音视频传输(流媒体)
音视频传输不同于一般的数据传输,多媒体信息的信息量往往很大,且多媒体数据传输对时延和时延抖动均有较高的要求。
常用的音视频服务分为三类:① 流式存储音视频;② 流式实时音视频;③ 交互式音视频。
5.1 流式存储音视频
传统的方式是:客户浏览器用HTTP协议从服务器获取音视频文件,当浏览器完全收到文件后,利用媒体播放器进行解压缩,然后播放。
为了使音视频能够实时播放,对传统方式进行改进:客户浏览器从万维网服务器中,通过HTTP协议获取 元文件(元文件包含实际音视频文件的URL),将元文件交给客户端媒体播放器,播放器根据元文件中音视频URL获取音视频。从而实现音视频的实时传输。
六、网络安全
在计算机网络通信中,面临着数据安全的威胁。因此需要对网络中传输的数据进行保护。
6.1 网络安全问题
计算机网络主要面临着如下威胁:
① 保密性 – 对称密钥密码和公钥密码
② 端点鉴别(识别发送方和接收方的真实身份) – 数字签名
③ 信息完整性 - 报文鉴别
④ 运行的安全性 – 访问控制,权限控制
6.2 网络数据加密
传统的数据加密模型如下图所示:
💗 6.2.1 对称密钥密码体制 K=M
对称密钥密码是指
加密密钥K
和
解密密钥M
使用相同的密码体制,即
K=M
。其中
数据加密协议DES属于对称密钥密码体制。DES是分组密码,加密前对明文进行分组,每组为长64位二进制程序,然后加密处理,产生一组64位密文数据(密钥56位,奇偶校验8位)。
DES的保密性仅取决于对密钥的保密,而算法是公开的。
对称密钥密码只能用于 一对一的双向保密通信。
💗 6.2.2 公钥密码体制 K≠M
公钥密码体系分为三个部分: 公钥, 私钥和 加密解密算法。公钥密码使用不同的
加密密钥K
和
解密密钥M
,即
K≠M
。在公钥密码中,
加密密钥K
是"
公钥",向公共公开,而
解密密钥M
是“私钥”,是保密的。加密算法和解密算法也是公开的。其加密解密过程如下:
● 加密:通过加密算法和公钥对内容(或者说明文)进行加密,得到密文。加密过程需要用到公钥。
● 解密:通过解密算法和私钥对密文进行解密,得到明文。
公钥密码可以用于 多对一的单向保密通信。
6.3 数字签名
具有保密性的数字签名过程如下图所示:
① 因为只有A本人有A的私钥,因此通过添加A的私钥可以用于验证A的身份, A的私钥也被称为A的数字签名。
② 在添加数字签名后在 添加B的公钥对明文进行加密。
6.4 报文鉴别
报文鉴别是为了验证发送信息的完整性,为了使发送方的数据无法被复制和修改,利用了密码散列函数来保证发送信息的唯一性(散列函数具有一一对应性,即无法找到两个不同的报文,它们具有相同的密码散列函数输出),散列的长度远远小于报文长度。
密码散列函数在报文鉴别的具体步骤为:
① 用户A根据自己的明文X
计算出散列H(X)
。
② 对散列H(X)
进行密钥加密,得到报文鉴别码MAC。
③ 将加密后的散列拼接在明文X的边,生成扩展报文(X,H(X))
,然后发送给用户B。
④ 用户B收到这个扩展报文(X,H(X))
将明文X与散列H(X)分开,将明文进行散列计算H`(X),将散列H(X)进行密钥解密,比较H(X)是否等于H`(x),若相等则说明报文正确,若不相等说明报文不正确。