网络

五层模型

复杂的系统需要分层,因为每一层都需要专注于一类事情。各层独立:屏蔽底层实现、透明、实现接口调用。灵活:每一层都可以使用最适合的技术来实现,功能以及暴露的接口的规则没有改变。分解:将复杂问题分解为许多比较小的、界线比较清晰简单的小问题来处理和解决。易于设计,实现和标准化。

TCP

1,面向连接的、可靠的(有序、不丢不重,段编号以及确认号:按序发送接收、确认(ACK)、超时重传(ARQ计时+累计确认+发送窗口)、差错控制)、基于字节(有拆分合并)、不保留报文边界、单播;双工通信;拥塞控制(慢开始 、 拥塞避免 、快重传 和 快恢复);流量控制。

2,流量控制:滑动窗口保证接收能及时接收,发送窗口:字节为单位、发送窗口(连续ARQ协议):已发送但未确认(重传)+可以发送未发送(可用窗口)、后沿:不动+前移,前沿:不动(无确认+接收窗大小不变、有确认+接收窗大小变小)+前移,可用窗口=0时超时(滑动均值)重传,零发送窗口窗口探测报文防死锁,发送窗口=min(接收窗口,拥塞窗口),接收<拥塞:接收端能力、接收>拥塞:网络拥塞状况;接收窗口:未有序到达(独立路由)+空白,接受缓存=按序到达+接收窗口,及时读取否则接受窗=0;

3,拥塞控制:防止网络过载、全局过程、无拥塞:增大、拥塞/可能拥塞:减小、慢开始(init=1、报文段确认则加一、传输轮次(窗口发送+确认)后倍增)、拥塞避免(x2,门限、一次往返+1)、快重传(单个数据丢失导致误判超时、超时为拥塞标志(cawd=1,thre=cawd/2、慢开始、通信不通数据、ack无发传输),接收方受到任何数据都立即发送有序ack,3ack时发送端立即发送缺失数据,防止超时 cawd=1)和快恢复(3ack触发、个别丢失、thred=cawd=cawd/2、拥塞避免);

4,三次握手:双方确认自己与对方的发送与接收是正常的。参数协商:双方知道对方的序列号(seq)同时让对方知道自己已经知道了对方的序列号(ack)。

5,四次握手:全双工

  1. A发送一个FIN置为1的包, seq = x ,此时A状态为 FIN_WAIT_1
  2. B收到包后,状态切换为CLOSE_WAIT发送一个ack = x + 1。A收到包之后状态切换为FNI_WAIT_2。半关闭状态,B->A
  3. B处理完任务后,向A发送一个 FIN包,seq = y; 同时将自己的状态置为LAST_ACK
  4. A收到包后状态切换为TIME_WAIT,并向B发送A ack = y + 1,等待2MSL后关闭连接closed态(保证连接的可靠性,确保B收到ACK包,如果B没有收到这个ACK包,将会重发FIN包,A做出响应,若A不等待直接关闭,B将不断超时重发包,无法关闭。2MSL后保证本次连接的所有报文都从网络消失,防止干扰新的连接)。B收到包后连接关闭、closed态。
建立连接丢包

1,客户端第一个「SYN」包丢了。

如果客户端第一个「SYN」包丢了,也就是服务端根本就不知道客户端曾经发过包,那么处理流程主要在客户端。在一定时间范围内,只要没有收到应答的「ACK」包,无论是请求包对方没有收到,还是对方的应答包自己没有收到,均认为是丢包了,会触发超时重传机制。所以此时会进入重传「SYN」包,会尝试三次,间隔时间分别是 5.8s、24s、48s。

2,服务端收到「SYN」并回复的「SYN,ACK」包丢了。

站在客户端的角度,会认为是最开始的那个「SYN」丢了,那么就继续重传,见1。

对服务端而言,如果发送的「SYN,ACK」包丢了,在超时时间内没有收到客户端发来的「ACK」包(第三次握手),也会触发重传,此时客户端处于 SYN_RCVD 状态,会依次等待 3s、6s、12s 后,重新发送「SYN,ACK」包。如果这个重试次数内,仍未收到「ACK」应答包,那么服务端会自动关闭这个连接。

3,客户端最后一次回复「SYN,ACK」的「ACK」包丢了。

如果最后一个「ACK」包丢了,服务端因为收不到「ACK」会走重传机制,而客户端此时进入 ESTABLISHED 状态。多数情况下,客户端进入 ESTABLISHED 状态后,则认为连接已建立,会立即发送数据。但是服务端因为没有收到最后一个「ACK」包,依然处于 SYN-RCVD 状态。若第三个报文中无数据,并且A在B等待期间发送数据传输报文,由于第三个无数据报文不消耗seq,第四个报文拥有和第三个报文一样的seq和ack,对B来说第四个报文就等价于第三个报文,只是该报文带数据而已,连接建立。若第三个报文中无数据无法建立连接。

4,客户端故意不发最后一次「SYN」包。

如果客户端是恶意的,在发送「SYN」包后,并收到「SYN,ACK」后就不回复了,那么服务端此时处于一种半连接的状态,虽然服务端会通过 tcp_synack_retries配置重试的次数,不会无限等待下去,但是这也是有一个时间周期的。如果短时间内存在大量的这种恶意连接,对服务端来说压力就会很大,这就是所谓的 SYN FLOOD 攻击。在接收到第一次握手报文后服务端不分配资源,并对对二个报文计算cookie,并对第三次握手的也计算一个cookie,两个cookie相同才分配资源。

断开连接丢包
  1. 断开连接的 FIN 包丢了。

如果一个包发出去,在一定时间内,只要没有收到对端的「ACK」回复,均认为这个包丢了,会触发超时重传机制。而不会关心到底是自己发的包丢了,还是对方的「ACK」丢了。直到触发重传的次数,直接关闭连接。

  1. 服务端第一次回复的 ACK 丢了。

此时因为客户端没有收到「ACK」应答,会尝试重传之前的「FIN」请求,服务端收到后,又会立即再重传「ACK」。

而此时服务端已经进入 CLOSED-WAIT 状态,开始做断开连接前的准备工作。当准备好之后,会回复「FIN,ACK」(第三次挥手),第三次挥手拥有和第二次挥手报文相同的ack。只要这个消息没丢,客户端可以凭借「FIN,ACK」包中的响应序号,发送第四次挥手报文,直接从 FIN-WAIT-1 状态,进入 TIME-WAIT 状态,开始长达 2MSL 的等待。

  1. 服务端发送的 FIN,ACK 丢了。

服务端在超时后会重传,此时客户端处于 FIN-WAIT-2 状态,会一直等待并响应第三次挥手报文;

  1. 客户端最后回复的 ACK 丢了。

客户端在回复「ACK」后,会进入 TIME-WAIT 状态,开始长达 2MSL 的等待,服务端因为没有收到「ACK」的回复,会重试一段时间,收到客户端重发的第四次挥手报文后断开连接,或者直到服务端重试超时后主动断开。

UDP

无连接、面向报文:发送端无拆分,只是增加一个 UDP 头标识;接收端无拼接,去掉 UDP 头标识后上传;保留报文边界、应用程序必须选择合适大小的报文。一对多,多对多,多对一的方式;不可靠:无连接、无反馈、没有拥塞控制、无流量控制;实时性好;头部开销小;头部+数据检错;

url->页面
状态码
状态保存

HTTP 无状态协议,需要额外的配置实现状态保存。

Socket

TCP:一个进程必须充当服务器端,它会主动监听某个指定的端口,另一个进程必须充当客户端,它必须主动连接服务器的IP地址和指定端口。

UDP
交换机、路由器

路由器实现了不同网络之间的数据转发,交换机实现了特定网络内的数据交换。工作层次不同:交换机主要工作在数据链路层路由器工作在网络层。转发依据不同:交换机转发所依据的对象时:MAC地址。路由转发所依据的对象是:IP地址。主要功能不同:交换机主要用于组建局域网,而路由主要功能是将由交换机组好的局域网相互连接起来,或者接入Internet。

HTTP、 HTTPS
请求、响应报文