Linux高性能服务器编程------学习笔记(一)

简单网络知识回顾和TCP/IP协议族的介绍

OSI七层模型和TCP/IP五层网络模型对比

Linux高性能服务器编程------学习笔记(一)_第1张图片

TCP/IP是一个四层的协议系统。主要有数据链路层、网络层、传输层、应用层。本部分重点学习:ICMP协议、ARP协议、DNS协议。

Linux高性能服务器编程------学习笔记(一)_第2张图片

令牌环网

令牌环网(Token Ring)是一种 LAN 协议,定义在 IEEE 802.5 中,其中所有的工作站都连接到一个环上,每个工作站只能同直接相邻的工作站传输数据。通过围绕环的令牌信息授予工作站传输权限。 

Linux高性能服务器编程------学习笔记(一)_第3张图片

构成:组成令牌环网需要的主要部件包括:1、网卡;2、多站访问单元(MAU);3、传输媒体;4、连接附件。

ARP协议

ARP协议能实现任意层的网络地址到物理地址的转换,本书讨论的ARP协议是从IP地址到以太网(MAC)地址的转换。为了提高发送数据包的效率,ARP维护了一个高速缓存,在Linux下可通过 arp 命令对其进行查看和修改。

RARP协议则与之相反,实现了IP地址和机器物理地址的转换,主要用于无存储功能的设备且管理者存储了其相关映射的特殊情况。

工作原理:主机向自己所在的网络广播一个ARP请求,该请求包含目标主机的网络地址。此网络上的其他机器都将收到这个请求,但只有被请求的目标机器会回应一个ARP应答,其中包括自己的物理地址。

DNS协议

        DNS是一个分布式的域名服务系统。每个DNS服务器都存放着大量的域名和IP地址的映射,并且更新是动态的。(众多客户端程序都使用DNS协议来向DNS服务器申请目标机器的IP地址)

socket和TCP/IP协议族

由socket定义的一组API主要有两点功能:

1.将应用程序数据从用户缓冲区复制到TCP/UDP内核发送缓冲区,以交付内核来发送数据,或者从内核TCP/UPD接受缓冲区中复制数据到用户缓冲区,以读取数据;

2.应用程序可以通过它们来修改内核中各层协议的某些头部信息或者其他数据结构,从而精细控制底层通信的行为。

IP协议详解

IP协议特点:为上层协议提供无状态、无连接、不可靠的服务。

(1)无状态:IP通信双发不同步传输数据的状态信息。缺点就是无法处理乱序或者重复的IP数据报。优点就是简单、高效。

(2)无连接:值IP通信双方不长久的维持对方的任何信息。

(3)不可靠:不能保证IP数据报准确的到达接收端,只是承诺尽最大努力。

IP分片:如果IP数据报的长度超过以太网帧的MTU(1500字节)就会被分片。

IP路由:决定发送数据报到目标机器的路径。

IP路由机制分为三个步骤:

(1)查找路由表中和数据报目标IP地址完全匹配的主机IP地址。如果找到则使用该路由项,否则跳转(2);

(2)查找路由表中和数据报目标IP地址具有相同网络ID的IP地址。如果找到就使用该路由项,否则跳转(3);

(3)选择默认路由项,这意味着数据的下一跳路由是网关。

ICMP重定向:ICMP重定向报文是ICMP控制报文中的一种。在特定的情况下,当路由器检测到一台机器使用非优化路由的时候,它会向该主机发送一个ICMP重定向报文,请求主机改变路由。路由器也会把初始数据报向它的目的地转发。(用于路由表的更新)

TCP协议

TCP协议相对于UDP协议的特点:面向连接、字节流和可靠传输。

面向连接:使用TCP通信的双方必须建立连接,双方都必须为该连接分配必要的的内核资源,以管理连接的状态和连接上数据的传输。TCP是全双工的,双方的数据读写可以通过一个连接进行。完成数据交换之后,通信双方都必须断开这个连接以释放系统资源。TCP连接是一对一的。

字节流:应用程序对数据的发送和接收是没有边界限制的。

UDP则不是,发送端程序每执行一次写操作,UDP模块就将其封装成一个UDP数据报并发送之。接收端必须及时的针对每一个UDP数据报执行读操作,否则就会丢包。

TCP头部结构中的六位标志位:

Linux高性能服务器编程------学习笔记(一)_第4张图片

TCP建立连接中的三次握手和四次挥手

Linux高性能服务器编程------学习笔记(一)_第5张图片

1)第一次握手:建立连接时,客户端向服务器发送SYN包(seq=x),请求建立连接,等待确认

2)第二次握手:服务端收到客户端的SYN包,回一个ACK包(ACK=x+1)确认收到,同时发送一个SYN包(seq=y)给客户端

3)第三次握手:客户端收到SYN+ACK包,再回一个ACK包(ACK=y+1)告诉服务端已经收到

4)三次握手完成,成功建立连接,开始传输数据

 Linux高性能服务器编程------学习笔记(一)_第6张图片

1)客户端发送FIN包(FIN=1)给服务端,告诉它自己的数据已经发送完毕,请求终止连接,此时客户端不发送数据,但还能接收数据

2)服务端收到FIN包,回一个ACK包给客户端告诉它已经收到包了,此时还没有断开socket连接,而是等待剩下的数据传输完毕

3)服务端等待数据传输完毕后,向客户端发送FIN包,表明可以断开连接

4)客户端收到后,回一个ACK包表明确认收到,等待一段时间,确保服务端不再有数据发过来,然后彻底断开连接

 TCP连接和关闭状态转移图

Linux高性能服务器编程------学习笔记(一)_第7张图片

状态 描述
CLOSED 阻塞或关闭状态,表示主机当前没有正在传输或者建立的链接
LISTEN 监听状态,表示服务器做好准备,等待建立传输链接
SYN RECV 收到第一次的传输请求,还未进行确认
SYN SENT 发送完第一个SYN报文,等待收到确认
ESTABLISHED 链接正常建立之后进入数据传输阶段
FIN WAIT1 主动发送第一个FIN报文之后进入该状态
FIN WAIT2 已经收到第一个FIN的确认信号,等待对方发送关闭请求
TIMED WAIT 完成双向链接关闭,等待分组消失
CLOSING 双方同时关闭请求,等待对方确认时
CLOSE WAIT 收到对方的关闭请求并进行确认进入该状态
LAST ACK 等待最后一次确认关闭的报文

 TCP超时重传

TCP服务必须能够重传超时时间内未收到确认的TCP报文段。TCP模块为每个TCP报文段都维护一个重传定时器,该定时器在TCP报文段第一次发送时被启动。如果超时时间内未收到接收方的应答,TCP模块将重传TCP数据报并充值定时器。

拥塞控制

用来提高网络利用率,降低丢包率,并保证网络资源对每条数据流的公平性。拥塞控制分为:慢启动、拥塞避免、快速重传、快速恢复

常见的超时重传控制算法

TCP Tahoe/Reno:最初的实现,包括慢启动、拥塞避免两个部分。基于重传超时(retransmission timeout/RTO)和重复确认为条件判断是否发生了丢包。两者的区别在于:Tahoe算法下如果收到三次重复确认,就进入快重传立即重发丢失的数据包,同时将慢启动阈值设置为当前拥塞窗口的一半,将拥塞窗口设置为1MSS,进入慢启动状态;而Reno算法如果收到三次重复确认,就进入快重传,但不进入慢启动状态,而是直接将拥塞窗口减半,进入拥塞控制阶段,这称为“快恢复”。而Tahoe和Reno算法在出现RTO时的措施一致,都是将拥塞窗口降为1个MSS,然后进入慢启动阶段。

TCP BBR(Bottleneck Bandwidth and Round-trip propagation time):BBR是由Google设计,于2016年发布的拥塞算法。以往大部分拥塞算法是基于丢包来作为降低传输速率的信号,而BBR则基于模型主动探测。该算法使用网络最近出站数据分组当时的最大带宽和往返时间来建立网络的显式模型。数据包传输的每个累积或选择性确认用于生成记录在数据包传输过程和确认返回期间的时间内所传送数据量的采样率。该算法认为随着网络接口控制器逐渐进入千兆速度时,分组丢失不应该被认为是识别拥塞的主要决定因素,所以基于模型的拥塞控制算法能有更高的吞吐量和更低的延迟,可以用BBR来替代其他流行的拥塞算法,例如CUBIC。

窗口控制解决了 两台主机之间因传送速率而可能引起的丢包问题,在一方面保证了TCP数据传送的可靠性。然而如果网络非常拥堵,此时再发送数据就会加重网络负担,那么发送的数据段很可能超过了最大生存时间也没有到达接收方,就会产生丢包问题。为此TCP引入慢启动机制,先发出少量数据,就像探路一样,先摸清当前的网络拥堵状态后,再决定按照多大的速度传送数据。

发送开始时定义拥塞窗口大小为1;每次收到一个ACK应答,拥塞窗口加1;而在每次发送数据时,发送窗口取拥塞窗口与接送段接收窗口最小者。

慢启动:在启动初期以指数增长方式增长;设置一个慢启动的阈值,当以指数增长达到阈值时就停止指数增长,按照线性增长方式增加至拥塞窗口;线性增长达到网络拥塞时立即把拥塞窗口置回1,进行新一轮的“慢启动”,同时新一轮的阈值变为原来的一半。

Linux高性能服务器编程------学习笔记(一)_第8张图片

快速重传和快速恢复:TCP采用的是累计确认机制,即当接收端收到比期望序号大的报文段时,便会重复发送最近一次确认的报文段的确认信号,我们称之为冗余ACK(duplicate ACK)。如图所示,报文段1成功接收并被确认ACK 2,接收端的期待序号为2,当报文段2丢失,报文段3失序到来,与接收端的期望不匹配,接收端重复发送冗余ACK 2。

Linux高性能服务器编程------学习笔记(一)_第9张图片

 这样,如果在超时重传定时器溢出之前,接收到连续的三个重复冗余ACK(其实是收到4个同样的ACK,第一个是正常的,后三个才是冗余的),发送端便知晓哪个报文段在传输过程中丢失了,于是重发该报文段,不需要等待超时重传定时器溢出,大大提高了效率。这便是快速重传机制。

补充:

滑动窗口控制:窗口的大小就是在无需等待确认包的情况下,发送端还能发送的最大数据量。这个机制的实现就是使用了大量的缓冲区,通过对多个段进行确认应答的功能。通过下一次的确认包可以判断接收端是否已经接收到了数据,如果已经接收了就从缓冲区里面删除数据。

Linux高性能服务器编程------学习笔记(一)_第10张图片

引用连接:

1.《Linux高性能服务器编程》

2.(39条消息) Linux高性能服务器编程 学习笔记①_u011871449的博客-CSDN博客

3.令牌环是什么 令牌环网结构介绍【图文】 - 知乎 (zhihu.com)

4.【C++工程师面试宝典】学习说明_互联网校招面试真题面经汇总_牛客网 (nowcoder.com)

5. 网络协议栈基本知识 - zhengcixi - 博客园 (cnblogs.com)

6.(39条消息) TCP的快速重传机制_whgtheone的博客-CSDN博客_tcp快速重传

你可能感兴趣的:(服务器,linux,学习)