Linux高性能服务器编程 第一章学习笔记
ARP协议可以实现任意网络层地址到任意物理地址的转换,最常见的是IP到MAC地址转换。工作原理是广播ARP请求,接收者检查IP相同返回单播的ARP应答。
ARP帧格式如下:
硬件类型 协议类型 硬件地址长度 协议地址长度 操作 发送端以太网地址 发送端IP 目的端以太网地址 目的端IP地址
2 2 1 1 2 6 4 6 4 字节
由于可以转换任意地址,因此需要指定地址类型(MAC为1,IP为0x800);然后确定地址长度(IPV4为4,MAC为6),操作分为请求(1)、应答(1),RARP请求(3)、RARP应答(4);最后是地址。
合计长度为28字节,加上以太网头部18字节,合计46字节,如果需要满足最小长度会填充至64字节。
域名转换为IP地址有多种方式,例如NIS、DNS和本地静态文件
DNS是一套分布式的域名服务系统,每个DNS服务器存放着大量域名和IP地址的映射,并且可以动态更新,支持IP和域名互相转换。
标识 标志 问题个数 应答资源个数 授权资源个数 额外资源个数 四种资源长度可变
2 2 2 2 2 2 字节
标识用于标记一对DNS查询和应答;
标志用于协商具体通信方式和状态,包括请求/应答(QR)、类型(opcode)、是否截断、递归/迭代、允许递归、应答状态等。
后四个字段对应资源的长度,之后是真正的资源,同样需要按照格式进行封装。
无状态:通信双方不同步传输数据的状态信息
无连接:通信双方不长久维持对方信息,每次通信必须指定接收方
不可靠:不保证数据报准确地到达接收端
因此,超时重传、数据确认等机制由更上层协议实现
版本:IPV4为4
首部长度:单位是4字节,通常值为5,代表20字节,最大为15,代表60字节
服务类型:控制该数据包需求,用四位来代表最小延时、最大吞吐量、最高可靠性和最小费用,只能选1位设置为1。
总长度:最大为65535字节,由于MTU限制,通常达不到最大长度
标识:唯一标识数据报,分片的标识相同
标志:第二位DF禁止分片,第三位MF更多分片,最后一片为0
片偏移:单位是8字节,除了最后一片,每片必须是8的倍数
生存时间:TTL,通常为64
协议:上层协议,ICMP为1,TCP为6,UDP为17
校验和:仅校验头部
可选部分:记录路由、时间戳、松散路由选择(必须经过所有路由)、严格源路由(只能经过指定路由)
IP输入队列——>IP模块CRC校验——>判断IP是否是本机IP或者广播—不是—>数据报转发子模块——>是否允许转发—是—>IP数据包输出子模块——>IP输出队列
ICMP协议虽然使用IP协议,但是仍然处于网络层。
ICMP报文的前四个字节是统一的格式,共有三个字段,即类型、代码、检验和,接着的四个字节取决于ICMP报文的类型,然后是数据部分,长度也取决于类型。
类型:
3——终点不可达
4——源点抑制(Source Quench)
5——改变路由(Redirect)
11——超时
12——参数问题
代码:根据类型,通常是对情况的说明,主机重定向代码为1
校验和:校验整个数据报
重定向时需要说明引起重定向的IP数据报的源IP地址以及应该使用的路由器的IP地址,接收主机据此就可以更新路由表缓冲
流标签:用于音视频等实时数据传输
净荷长度:扩展头部和数据长度之和
下一个包头:固定头部后的包头类型,类似IPV4中的协议字段
TCP服务的特点:面向连接、字节流和可靠传输
URG:紧急指针是否有效
ACK:确认号是否有效,携带ACK为确认报文段
PSH:提示接收端立即从TCP缓冲区读走数据
RST:要求对方重新建立连接,携带RST为复位报文段
SYN:请求建立简介,携带SYN为同步报文段
FIN:结束报文段
检验和校验头部和数据,保证可靠传输
(1)三次握手
第一次握手是A建立连接发送的A的同步报文段,只有seq号,没有ack号
第二次握手是B建立连接同时回复确认发送的B的同步、确认报文段,seq号,ack号为A的seq号+1。
第三次握手是A回复确认发送的A的确认报文段,seq号为上次的seq号+1,ack号为B的seq号+1。该报文段可以携带数据。
序列号是标识TCP数据流中的每一字节的,不过同步报文段虽然不含数据,同样占用一个序号值。
第一次握手之后没有收到确认会多次重复发送同步报文段,直到达到最大发送次数。
(2)四次挥手
第一次挥手是A断开连接发送的A的结束报文段,seq号同样占用一个
第二次挥手是B回复确认报文段,ack为A的seq+1
第三次挥手是B断开连接发送的结束报文段
第四次挥手是A回复确认报文段
由于TCP是全双工连接,因此允许A断开之后继续接收来自B的消息,直到B发送结束报文段,此中间状态叫做半关闭状态。
(3) TIME_WAIT状态
指的是A在断开与B的连接并收到来自B的结束报文段后,到完全关闭接收来自B消息的时间,通常为2*MSL,建议值2min。
该状态的目的是:
1、可靠地终止TCP连接,因为回复的确认报文段可能丢失,再次收到来自B的结束报文段可以再次回复确认。
2、保证让迟来的TCP报文段有足够的时间被识别并丢弃。因为TCP端口不能被同时打开多次,如果不存在该状态,在结束一次TCP之后重新建立相似连接,可能会接收到上一次连接中迟到的报文段。通过等待2MSL,保证迟到的TCP报文段都被丢弃。
因此,当程序退出后,通常不能立即重启。可以通过选项设置强制重启。
产生复位有三种情况:
(1)访问不存在的端口或处于TIME_WAIT状态的端口
RST位置1,窗口大小设为0,发送方不需要接收该回复报文段
(2)异常终止连接
一方给另一方发送复位报文段,另一方等待发送的数据都将被丢弃
(3)处理半打开状态
有两种类型:交互数据和成块数据。
交互数据强调实时性,服务器端在回复确认的同时将需要交互的数据发送给客户端;客户端等待确认的同时收集本端需要发送的数据。Nagle算法要求一个TCP连接的通信双方在任意时刻最多只能发送一个未确认的TCP报文段。
成块数据强调效率,服务器发送多个TCP报文段,客户端可以对最后接收的报文段进行确认,并通过窗口控制流量。
慢启动、拥塞避免、快速重传和快速恢复
核心是合理选择发送窗口(SWND)的大小,该值由接收窗口(RWND)和拥塞窗口(CWND)的较小值决定。
慢启动:
每收到一个ack,CWND增加1。表现为CWND每过一个轮次就翻倍,直到超过阈值,进入拥塞避免阶段。
拥塞避免:
每收到一个ack,CWND增加1/CWND。表现为每一轮次CWND加1,直到超时再次进入慢启动(CWND变为1),或者三次收到同一ack的报文进入快速重传
快速重传:
收到三个相同的ACK报文后,立即重传丢失的报文段,并要求接收方立即回复,CWND缩小为原来的1/2,阈值设置为CWND。由于缺失被补充,因此接收方返回的确认可能是对之前发送的更后的ACK确认,进入快恢复阶段。
快恢复:
CWND从阈值处开始拥塞避免
分为正向代理、反向代理和透明代理
正向代理:客户端自己设置代理服务器的地址,客户端的请求被直接发到代理服务器,并由代理服务器来请求目标资源。
反向代理:服务器端设置,接收连接请求,然后转发到内部网络的服务器,并将结果返回给客户。
透明代理:在网关上设置正向代理,对客户端是透明的。
对基本协议进行介绍,通过一个案例了解端口通信过程