总结《Linux高性能服务器编程》1-4章


垂直的实线箭头表示TCP/IP协议族各层之间的实体通信(数据包确实是沿着这些线路传递的),而水平的虚线箭头表示逻辑通信线路;
数据链路层实现了网卡接口的网络驱动程序;
ARP协议(Address Resolve Protocol,地址解析协议)和RARP协议(逆地址解析协议)实现了IP地址和机器物理地址(通常是MAC地址,以太网、令牌环和802.11无线网络都使用MAC地址)之间的相互转换。
网络层实现数据包的选路和转发,且对上层协议隐藏了网络拓扑连接的细节;
IP协议根据数据包的目的IP地址来决定如何投递它;
ICMP协议是IP协议的重要补充,用于检测网络连接,ICMP报文包括两种类型;
传输层为两台主机上的应用程序提供端到端(end to end)的通信;
TCP协议(Transmission Control Protocol,传输控制协议)为应用层提供可靠的、面向连接的和基于流(stream)的服务;
UDP协议(User Datagram Protocol,用户数据报协议)为应用层提供不可靠、无连接和基于数据报的服
务;
SCTP协议(Stream Control Transmission Protocol,流控制传输协议)是一种相对较新的传输层协议,它为在因特网上传输电话信号而设计;
ping是应用程序,而不是协议,它利用ICMP报文检测网络连接,是调试网络环境的必备工具;
telnet协议是一种远程登录协议,它使我们能在本地完成远程任务;
#大部分情况下,我们只是使用它查看目标主机是否打开了某端口
#其执行结果有两种:
telnet: connect to address 101.199.97.65: Connection refused #端口未打开
Connected to 10.88.11.25. #端口已打开
OSPF(Open Shortest Path First,开放最短路径优先)协议是一种动态路由更新协议;
DNS(Domain Name Service,域名服务)协议提供机器域名到IP地址的转换;
host 命令:使用DNS协议和DNS服务器通信,查询目标主机IP地址;terminal 1:$sudo tcpdump -i ens33 -nt -s 500 port domain
#开启tcpdump抓包,使用“port domain”来过滤数据包,表示只抓取使用domain(域名)服务的数据包;
#使用-s 500限制只抓500kB的数据;使用-n表示显示IP地址而不是主机名;使用-t不显示时间戳
terminal 2:$host-t A www.baidu.com
#terminal 2即会显示DNS查询和应答报文
应用层协议(或程序)可能跳过传输层直接使用网络层提供的服务;

应用程序数据在发送到物理网络上之前,将沿着协议栈从上往下依次传递。每层协议都将在上层数据的基础上加上自己的头部信息(有时还包括尾部信息),以实现该层的功能;
当帧到达目的主机时,将沿着协议栈自底向上依次传递,各层协议依次处理帧中本层负责的头部数据,以获取所需的信息,并最终将处理后的帧交给目标应用程序;
以太网帧的MTU是1500字节,因此它携带的IP数据报的数据部分最多是1480字节(IP头部
占用20字节),当IP数据报的长度超过帧的MTU时,它将被分片传输;
可以通过 ifconfig 命令或者 netstat 命令查看以太网帧即IP地址等;

使用 route 命令或 netstat 命令查看路由表;
IP路由机制的步骤:
更新路由表:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vk1hPOjU-1668245546771)(img/Linux高性能服务器编程/image-20221024083439691.png)]](https://1000bd.com/contentImg/2024/04/24/4e7a80b929c91cac.png)
terminal 1 $ sudo tcpdump -i ens33 -nt '(src 192.168.111.170 and dst 14.215.177.38 or src 14.215.177.38 and dst 192.168.111.170)'
termial 2 $ telnet 14.215.177.38 80 # 使用telnet建立TCP连接


粗虚线表示典型的服务器端连接的状态转移,粗实线表示典型的客户端连接的状态转移
服务器端连接状态:LISTEN状态、ESTABLISHED状态、CLOSE_WAIT状态、LAST_ACK状态;
客户端连接状态:SYN_SENT状态、ESTABLISHED状态、FIN_WAIT_1状态、FIN_WAIT_2状态、CLOSE_WAIT状态、TIME_WAIT状态;

TIME_WAIT状态存在的原因:可靠地终止TCP连接,保证让迟来的TCP报文段有足够的时间被识别并丢弃;
TIME_WAIT等待一段长为2MSL(Maximum Segment Life,报文段最大生存时间),坚持2MSL时间能够确保网络上两个传输方向上尚未被接收到的、迟到的TCP报文段都已经消失;
服务器端由于使用知名端口号,所以TIME_WAIT状态会影响重启,但客户端一般使用系统自动分配的临时端口号来建立连接,所以一般可以立即重启;
四个部分:慢启动(slow start)、拥塞避免(congestion avoidance)、快速重传(fast retransmit)和快速恢复(fastrecovery);
拥塞控制算法在Linux下有多种实现,比如reno算法、vegas算法和cubic算法等;
一些概念:
发送端需要合理地选择SWND的大小,如果SWND太小,会引起明显的网络延迟;反之,如果SWND太大,则容易导致网络拥塞;

在HTTP通信链上,客户端和目标服务器之间通常存在某些中转代理服务器,它们提供对目标资源的中转访问;
代理服务器按照其使用方式和作用,分为正向代理服务器(客户端)、反向代理服务器(服务器端)和透明代理服务器(网关);

HTTP请求
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e00xvGXN-1668245546772)(img/Linux高性能服务器编程/image-20221025081608874.png)]](https://1000bd.com/contentImg/2024/04/24/645b0a7f85210631.png)
GET http://www.baidu.com/index.html HTTP/1.0
User-Agent:Wget/1.12(linux-gnu)
Host:www.baidu.com
Connection:close
“GET”是请求方法
“http://www. baidu.com/index.html”是目标资源的URL
“http”是所谓的scheme,表示获取目标资源需要使用的应用层协议,其他常见scheme还有ftp/file等
“www.baidu.com”指定资源所在的目标主机
“index.html”指定资源文件的名称
“HTTP/1. 0”表示客户端(wget程序)使用的HTTP的版本号是1.0
HTTP请求内容中的第2~4行都是HTTP请求的头部字段,在空行之后,HTTP请求可以包含可选的消息体
HTTP应答
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W8hvJbBv-1668245546772)(img/Linux高性能服务器编程/image-20221025082257711.png)]](https://1000bd.com/contentImg/2024/04/24/d474a923c8961f0d.png)
HTTP/1.0 200 OK
Server:BWS/1.0
Content-Length:8024
Content-Type:text/html;charset=gbk
Set-Cookie:BAIDUID=A5B6C72D68CF639CE8896FD79A03FBD8:FG=1;expires=Wed,04-
Jul-42 00:10:47 GMT;path=/;domain=.baidu.com
Via:1.0 localhost(squid/3.0 STABLE18)
“200 OK”是状态码和状态信息
第2~7行是HTTP应答的头部字段
空行之后是被请求文档index.html的内容