linux高性能服务器编程学习总结(一)

第一章 TCP/IP协议详解
1.1 TCP/IP协议族体系结构及主要协议
应用层:ping telnet OSPF DNS
传输层: TCP UDP
网络层: ICMP IP
数据链路层: ARP DataLink RARP
在这里插入图片描述1.1.1数据链路层
实现了网卡接口的网络驱动程序,以处理数据在物理媒介(以太网、令牌环)上的传输。不同的物理网络具有不同的电气特性,网络驱动程序隐藏了这些细节。
常用的协议是ARP(Address Resolve Protocol)、RARP。他们实现了IP地址和机器物理地址(通常是MAC地址)之间的相互转换.
网络层使用IP地址寻址一台机器,而数据链路层使用物理地址寻一台机器,在网络层必须将目标机器的IP地址转换成物理地址,才能使用数据链路层提供的服务这就是ARP协议的用途。RARP仅用于网络上的某些无盘工作站。因为缺乏存储设备无盘工作站无法记住自己的IP地址,但可以利用网卡上的物理地址向网络管理者查询自身的IP地址。运行RARP服务的网络管理者通常存有该网络上所有机器的物理地址到IP地址的映射。

1.1.2 网络层
网络层实现数据包的选路和转发。WAN(广域网)通常使用众多分级的路由器来连接分散的主机或LAN。因此,通信的两台主机一般不是直接连接,而是通过多个中间节点(路由器)连接的。网络层的任务就是选择这些中间节点,以确定两台主机之间的路径。同时,网络层对上次协议隐藏了网络拓扑连接的细节。
IP协议是网络层最核心的。IP协议数据包的目的IP地址来决定如何投递它。如果数据包不能直接发送给目标主机,那么IP地址就寻找下一跳路由器,并将数据包交付给该路由器来转发。多次重复这一过程,或者由于发送失败而被丢弃。
网络层另外一个重要的协议就是ICMP(因特网控制报文协议)。它是IP地址的重要补充,主要用于检测网络连接。ICMP协议如下:
在这里插入图片描述
8位类型字段:用于区分报文类型。它将ICMP报文有两类:1:差错报文:主要用来回应网络错误,比如目标不可以到达(类型值为3)和重定向(类型值5);2:查询报文:用来查询网络信息,比如ping程序就是使用ICMP报文查看目标是否可到达(类型值8)。
8位代码字段:进一步细分不同的条件。比如重定向报文使用代码值0表示对网络重定向,代码值1表示对主机重定向。
16位检验和:对整个报文包括头部和内容部分进行循环冗余检验(CRC),以检验报文在传输过程中是否损坏。
需要指出的是,ICMP协议并非严格意义上的网络层协议,因为使用处于同一层的IP协议提供的服务(一般来说,上层协议使用下层协议提供的服务)

1.1.3 传输层
与网络层使用的逐跳通信方式不同,传输层只关心通信的起始端和目的端,而不在乎数据包的中转过程。负责数据的收发、链路的超时重传等
在这里插入图片描述
主要协议有三个:TCP、UDP和SCTP
TCP:为应用层提供可靠、面向连接和基于流(stream)的服务。TCP协议使用超时重传、数据确认等方式来确保数据包被正确地发送至目的端。使用双方必须先建立TCP连接,并在内核中为该连接维持一些必要地数据结构,比如连接状态、读写缓冲区、以及诸多定时器等。当通信结束时,双方必须关闭连接以释放这些内核数据。TCP是基于流地,因此没有边界(长度)限制,不断地从通信地一端流入另一端。发送端可逐个字节写入数据,接收端也可以逐个字节地读出。
UDP:与TCP协议相反,它为应用层提供不可靠、无连接和基于数据报地服务。无法保证数据从发送端正确地发送到目的端。UDP协议是无连接地,即通信双方不保持一个长久的联系,因此应用程序每次发送数据都要明确指定接收端的地址(IP地址等信息)。每个UDP数据报都有一个长度,接收端必须以该长度为最小单位将其所有内容一次性读出,否则数据将被截断。
SCTP(流控制传输协议)是相对交新的传输层协议,它是为了在因特网上传输电话信息而设计的。

1.1.4应用层
前三次负责处理网络通信细节,在内核空间中实现。而应用层则在用户空间实现。
PING是应用程序,而非协议,利用ICMP报文检测网络连接,是调试网络环境的必备工具
telnet协议是一种远程登录协议。
OSPF(Open Shortest Path First,开放最短路径优先)协议是一种动态路由更新协议,用于路由器之间的通信,以告知对方各自的路由信息
DNS(Domain Name Service,域名服务)协议提供机器域名到IP地址的转换
应用层协议可能跳过传输层直接使用网络层提供的服务,比如ping和OSPF。应用层协议通常使用TCP服务,又可以使用UDP服务,比如DNS协议。可通过/etc/services文件查看所有知名的应用层协议

1.2 封装
在这里插入图片描述
数据链路层封装的数据称为帧。以太网上传输的是以太网帧,而令牌环网络上传输的则是令牌环帧,其中以太网帧的封装格式如下:
在这里插入图片描述
以太网帧的最大传输单元(Max Transmit Unit,MTU)为1500字节,过长的IP数据报可能需要被分片传输。

1.3 分用
当帧达到目的主机,将沿着协议栈自底向上依次传递,各协议层依次处理帧中本层负责的头部数据,以获取所需的信息,最终将处理后的帧交给目标应用程序,这个过程称为分用。分用依靠头部信息中的类型字段实现的
在这里插入图片描述
IP、ARP、RARP都使用帧传输数据,所以帧的头部需要提供字段来区分,以以太网帧为例,使用2字节的类型字段来标识上层协议:若主机收到以太网帧类型字段的值为0x800,则帧的数据部分为IP数据报,以太网驱动程序将帧交付给IP模块;若类型字段的值为0x806,则帧的数据部分为ARP请求或者应答报文;若类型字段的值为0x835则帧的部分为RARP请求或应答报文,以太网驱动程序就将帧交付给RARP模块
同样的ICMP,TCP,UDP都使用IP协议,所以IP数据报的头部采用16位协议(protocol)字段来区分他们。
TCP和UDP数据报则通过其头部的16位端口号字段来区分上层应用。如DNS:端口号是53,HTTP:对应是80。可以在/etc/services中找到,经过上述分用,将原始数据送至目标服务
1.5 ARP工作原理
实现任意网络层地址到任意物理地址的转换,工作原理:主机向自己所在的网络广播一个ARP请求,该请求包含目标机器的网络地址。此网络上的其他所有机器都将收到这个请求,但只有被请求的目标机器会回应一个ARP应答,其中包含自己的物理地址,其中ARP请求/应当报文如下:
在这里插入图片描述
硬件类型:物理地址的类型,1表示MAC地址
协议类型:要映射的协议地址类型,0x800表示IP地址
硬件地址长度:对MAC地址来说,长度为6;
协议地址长度:对IPV4来说,长度为4
操作字段:1(ARP请求)、2(ARP应答)、3(RARP请求)、4(RARP应答)
最后4个字段指定通信双方的以太网地址和IP地址。发送端填充除目的端以太网地址外的其他3个字段,以构建ARP请求并发送之。接收端发现请求的目的端IP地址是自己,就把自己的以太网地址填进去,然后交换两个发送端和目的端地址和IP地址,以构建ARP应答并返回之。
ARP请求/应答报文的长度为28字节。如果再加上以太网帧头部和尾部的18字节,则一个携带ARP请求应答报文的以太网帧长度为46字节。不过有的实现要求以太网帧数据部分长度至少为46字节,此时ARP报文将增加一些填充字节。

1.5.2 ARP高速缓存的查看和修改
arp-a(查看) arp-d(删除) arp-s(添加)

1.6 DNS工作原理
域名查询服务有很多实现方式,如NIS(network information service,网络信息服务)、DNS和本地静态文件等
DNS是一套分布式的域名服务系统,查询和应答报文如下1
在这里插入图片描述
16位标识:区分一个DNS应答对应的DNS查询
16位标志字段:协商具体的通信方式和反馈通信状态,具体细节如下:
在这里插入图片描述
QR:0(查询)、1(应答)
opcode:定义查询和应答的类型,0(标准查询),1(反向查询由IP地址获得主机域名),2(请求服务器状态)
AA:授权应答标志,仅由应答报文使用,1(表示授权服务器)
TC:截断标志,仅当DNS报文使用UDP服务时使用,1(DNS报文超过512字节将被截断)
RD:递归查询标志。1(执行递归查询,如果目标DNS服务器无法解析某个主机名,则它将向其他DNS服务器继续查询),2(迭代查询,DNS服务器无法解析某个主机名,则它将自己知道的其他DNS服务器的IP地址返回给客户端)
RA:允许递归标志。仅由应答报文使用,1(支持递归查询)
zero:未使用,必须都设置为0
rocde:4位返回码,标志应答的状态。常用值0(无错误)和3(域名不存在)
接下来的4个字段分别指出DNS报文的最后4个字段的资源记录数目。
查询报文:1个查询问题,而应答资源记录数、授权资源记录数和额外资源记录数则为0。
应答报文:应答资源记录数则至少1,而授权资源记录数和额外资源记录数可为0或非0。
在这里插入图片描述
查询名以一定的格式封装了要查询的主机域名。16查询类型表示如何执行查询操作:
类型A,值是1,表示获取目标主机的IP地址
类型CNAME,值是5,表示目标主机的别名
类型PTR,值是12,表示方向查询
16位查询类通常为1,表示获取因特网地址
应答字段、授权字段和额外信息字段都使用资源记录(Resource Record)
在这里插入图片描述
32位域名是该记录中与资源对应的名字,其格式和查询问题中的查询名字段相同。16位类型和16位类字段的含义也与DNS查询问题的对应字段相同。
32位生存时间表示该查询记录结果可被本地客户端程序缓存多长时间,单位是秒。
16位资源数据长度字段和资源数据字段的内容取决于类型字段。对于类型A而言,资源数据是32位的IPV4地址,而资源数据长度则4(以字节为单位)

1.6.2 Linux下访问DNS服务
Linux使用/etc/resolv.conf文件来存放DNS服务的IP地址。分别是首选DNS服务器地址和备选DNS服务器地址

host-t A www.baidu.com(向首选DNS服务器219.239.26.42查询机器www.baidu.com的IP地址)

使用tcpdump观察DNS通信过程
1.首选抓取LAN上传输的以太网帧
sudo tcpdump-i eth0-nt-s 500 port domain
host-t A www.baidu.com
其中"port domain"来过滤数据包,表示只抓取使用domain(域名)服务的数据包,即DNS查询和应答报文
在这里插入图片描述
第一个数据包,数值57428是DNS查询报文的标识值,因此也在DNS应答报文,“+”表示启用递归查询标志。“A?”表示使用A类型的查询方式。"www.baidu.com"则是DNS查询问题中的查询名。括号中的数值31是DNS查询报文的长度(以字节为单位)。
第二个数据包,“3/4/4”表示该报文中包含3个应答资源记录、4个授权资源、3个应答资源记录的内容。“CNAME www.a.shifen.com.,A 119.75.218.77,A 119.75.217.56”则表示3个应答资源记录的内容。其中CNAME表示紧随其后的记录是机器的别名,A表示紧随其后的记录是IP地址,该应答报文的长度为226字节。tcpdump-x可以看到DNS报文的每一个细节

2.1 IP服务的特点
IP是TCP/IP协议族的动力,位上层提供无状态、无连接、不可靠的服务
无状态:IP通信双方不同步传输数据的状态信息,因此所有IP数据报的发送、传输和接收都是相互独立、没有上下文关系的。
虽然IP数据报头部提供了一个标识字段用以唯一表示一个数据报,但它是被用来处理IP分片和重组的,而非提供接收顺序的,因此接收端的IP模块只要接收到了完整的IP数据报,就将数据部分交给上层协议。缺点:无法处理乱序和重复的IP数据报;优点:简单、高效,无须为保持通信的状态而分配一些内核资源,也无须每次传输数据都携带状态信息,无状态很常见如UDP\HTTP

无连接:每次发送数据都必须明确指定对方的IP地址

不可靠:IP协议不能保证数据报准确到达接收端,无论哪种情况,发送端的IP模块一旦检测到IP数据报发送失败,就通知上层协议发送失败,而不会试图重传

2.2IPV4头部结构
通常长度为20字节,除非有可变长的选项部分

4位版本号:版本IP,其值是4
4位头部长度:标识该IP头部有多少个32bit(4字节)。因为4位最大能表示15,所以IP头部最长是60字节。
8位服务类型(TOS):3位的优先权字段,4位的TOS字段和1位保留字段(必须置0)。4位的TOS字段分别表示:最小延时,最大吞吐量,最高可靠性和最小费用,其中最多有一个置为1。例如ssh和telnet这样的登录程序需要最小延时服务;而ftp则需要最大吞吐量的服务。
16位总长度(字节数):整个IP数据报的长度,因此IP数据报的最大长度为65535字节。但由于MTU的限制,长度超过MTU的数据报都将被分片传输。接下来的3个字段则描述如何实现分片。
16位标识:唯一地标识主机发送地每一个数据报,其初始值由系统随机生成;每发送一个数据报,其值就加。该值在数据报分片时被分配到每个分片中
3位标志:第一位保留。第二位(Don’t Fragment)表示"禁止分片"。如果设置了这个位,IP模块将不对数据报进行分片,在这种情况下数据报长度超过MTU地话,IP模块将丢弃该数据报并返回一个ICMP差错报文。第三位(More Fragment,MF)表示更多分片,除了最后一个分片外,其他分片都要置为1
13位分片偏移:实际地偏移值是该值左移3位(乘8)后得到。除了最后一个IP分片外,每个IP分片的数据部分的长度必须是8的整数倍
8位生存时间(TTL):允许经过的路由器跳数,每经过一个路由,该值就被路由器减1。TTL值可以防止数据报陷入路由循环。
8位协议:用来区分上层协议,ICMP:1,TCP:6,UDP:17
16位头部校验和:发送端填充,接收端对其使用CRC算法以检验IP数据报头部在传输过程中是否损坏
32位源端IP地址:一般情况下,地址在数据报的传递过程中保持不变
32位目的端IP地址:同上
IPV4最后一个选项字段是可变长的可选信息,这部分最多包含40字节。可用的选项包括:
1.记录路由:告诉数据报途径的所有路由器都将自己的IP地址填入IP头部的选项部分
2.时间戳:每个路由器将数据报被转发的时间填入
3.松散源路由选择,指定一个路由器IP地址列表,数据报发送过程中必须经过其中所有的路由器
4.严格源路由选择,数据报只能经过被指定的路由器
使用tcpdump抓取IPV4头部结构
sudo tcpdump-ntx-i lo #抓取本地回路上的数据包

2.3IP分片
当IP数据报长度超过MTU时,将被分片,分片可能发生在发送端,也可能发生在中转路由器上,而且可能在传输过程中被多次分片,但只有在最终的目标机器上,这些分片才会被内核中的IP模块重新组装。
IP头部中的1.数据报标识2.标志3.片偏移给IP的分片和重组提供了足够的信息。除最后一个分片外,其他分片都将设置MF标志。此外,每个分片的IP头部的总长度字段将被设置为该分片的长度。
以太网是MTU是1500字节,因此它携带的IP数据报的数据部分最多是1480字节(IP头部占用20字节)。考虑用IP数据报封装一个长度为1481字节的ICMP报文(ICMP头部长度8字节,所以数据部分长度1473字节),则该数据报在使用以太网帧传输时必须被分片

2.5 IP转发
非本机的IP数据报将由数据报转发子模块来处理,路由器都能执行数据报的转发,而主机只发送和接收数据,因为主机/proc/sys/net/ipv4/ip_forward内核参数默认被置为0。可以进行秀修改
echo 1>/proc/sys/net/ipv4/ip_forward
数据报转发的步骤:
1)检查数据报头部的TTL值,如果TTL值为0,则丢弃该数据报
2)查看数据报头部的严格路由选项,如果该选项被设置,则检测数据报的目标IP地址是否是本机的某个IP地址。如果不是,则发送一个ICMP源站选路失败报文给发送端
3)如果有必要,则给源端发送ICMP重定向报文,以告诉它更合理的下一跳路由器
4)将TTL值-1
5)处理IP头部选项
6)如果有必要,则执行IP分片操作

2.6重定向
2.6.1ICMP重定向报文
在这里插入图片描述
重定向报文的类型值是5,代码字段有4个可选值,用来区分不同的重定向类型,只讨论主机重定向,其代码值为1。
ICMP重定向报文的数据部分给接收方提供两个信息:
1)引起重定向的IP数据报
2)应该使用的路由器的IP地址
接收主机根据这两个信息就可以断定引起重定向的IP数据报应该使用哪个路由器来转发,并且以此来更新路由表。
/proc/sys/net/ipv4/conf/all/send_redirects内核参数指定是否允许发送ICMP重定向报文,
而/proc/sys/net/ipv4/conf/all/accept_redirects内核参数则指定是否允许接收ICMP重定向报文。一般来说,主机
只能接收ICMP重定向报文,而路由器只能发送ICMP重定向报文
2.7 IPV6
相较2.0增加了多播和流的功能,为网络上多媒体内容的质量提供精细的控制;引入自动配置功能;增加专门的网络安全功能
40字节的固定头部和可变长度的扩展头部
在这里插入图片描述
4位版本:指定IP协议的版本
8位通信类型:数据流通信类型或优先级,类型于IPV4的TOS
20位流标签:用于对连接的服务质量有特殊要求的通信
16位净长度:IPV6扩展头部和应用程序长度之和,不包括固定头部长度
8位下一个包头:指出紧跟IPV6固定头部后的包头类型
8位跳数限制:和IPV4的TTL含义相同
IPV6用128位(16字节)来表示IP地址,使得IP地址总量达2^128个
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值