学习笔记 Linux高性能服务器编程

《Linux高性能服务器编程》 游双著

IP协议详解

IP服务特点

IP协议在网络层,是传输层的TCP/IP协议族的动力。
特点:无状态、无连接、不可靠

无状态

IP通信双方不同步传输数据的状态信息。
缺点:乱序、重复
所有IP数据报之间相互独立,因此可能是乱序的,也可能重复收到同一个IP数据报。(TCP协议面向连接,有状态,能够处理乱序、重复)
优点:简单、高效
不需要为了保持通信状态而携带状态信息。
UDP、HTTP也是无状态协议

无连接

IP通信双方不保持对方的任何信息,因此,上层协议每次发送数据,都需要明确指定对方的IP地址。

不可靠

IP协议不保证IP数据包准确到达接收端,比如发生超时、数据报错误(通过校验机制)。

谁检测错误?发送端的IP模块。

发生错误时做什么?发送端的IP模块通知上层协议发送失败,但不试图重传

IPv4头部结构

4位版本号,IPv4值是4,其他IPv4协议的扩展版本则是其他值。

4位头部长度,表示该IP头部有多少个4字节,由于4位最多表示15,因此IP头部最长是60字节

8位服务类型,其中有4个TOS字段(Type Of Service),可以通过置其中的唯一一位为1来选择最小延时、最大吞吐量、最高可靠性、最小费用。

16位总长度,标记了整个IP数据报的长度,最大长度为65535(2^16 - 1),注意,由于MTU限制,超过MTU长度的数据报都将被分片。

16位标识,唯一地标识主机发送的每一个数据报。该标识初始值由系统随机生成,每发送一个数据报,值加一。该值在分片时被复制到每个分片里,因此同一数据报的不同分片具有相同标识

3位标志字段,第一位保留,第二位(Don’t Fragment, DF)表示禁止分片,如果设置了这个位,IP模块将不再对数据报分片,如果IP数据报长度超出MTU,会被丢弃,并返回一个ICMP差错报文。第三位(More Fragment, MF)表示更多分片,除了数据报的最后一个分片,其他分片都要将它置为1。

以上3位标志字段的第三位,说明数据报中的分片是存在先后顺序的,如何实现?看下一段。

13位分片偏移,记录分片对于原始IP数据报开始处的偏移。实际偏移值是该值左移3位(乘8)得到的,因此,除了最后一个IP分片外,每个IP分片的数据部分的长度必须是8的整数倍(这样才能保证后面的IP分片拥有一个合适的偏移值)。

8位生存时间(Time TO Live,TTL),是数据报到达目的地之前允许经过的最大路由跳数。TTL由发送端设置,每经过一个路由,TTL 减一,TTL为零时,路由器丢弃数据报,并向源端发送一个ICMP差错报文。TTL可以防止数据报陷入路由循环

8位协议,用于区分上层协议。ICMP是1,TCP是6,UDP是17。

16位头部校验和,接收端使用CRC算法以检验IP数据报头部(只检验头部)。

32位源IP地址、32位目的IP地址,无论中间经过多少个路由器,这两个值都不变。

前面所有这些字段有20字节长,而IP头部最长为60字节,因此最后还有一个选项字段最长40字节)。
可用的IP选项:

记录路由,通知途中的所有路由器把IP填入选项部分。
时间戳,告诉每个路由器,将数据报被转发的事件填入选项部分。
松散源路由选择,指定一个路由器IP地址列表,要求数据报在发送过程中必须经过其中所有的路由器。
严格源路由选择,指定一个路由器IP地址列表,要求数据报在发送过程中必须且只能经过其中所有的路由器。

IP分片发生在哪?在哪重组?
发送端或中断路由器上,可能发生多次分片,并且只有在最终目标机器上,这些分片才会被内核中的IP模块重新组装。IP层传递给数据链路层的数据可能是一个完整的IP数据报,也可能是一个IP分片,它们统称为IP 分组 。
值得注意的是,每个分片都包含IP头部(20字节)
如何保证分片和重组的可靠性?
上面所说的,数据报标识、3位标志字段、片偏移保证了分片和重组的可靠性。

IP路由

IP转发包括:应该发送至哪个下一跳路由(或者目标机器)、经过哪个网卡发送。

在转发之前需要经过以下操作:

1、IP模块接收到来自数据链路层的IP数据报
2、处理IP头部选项
3、检查是否是发给本机的数据报,是的话进行分用(传递给上层应用),不是的话进入下一步
4、检测是否允许转发,不允许则丢弃数据报,允许则由路由表计算下一跳路由

IP路由表怎么更新

静态路由更新:可以用route命令或其他工具手动修改路由表
动态路由更新:BGP/RIP/OSPF
ICMP重定向报文
网关

IPv6

相比IPv4增加了多播、流,为网络上多媒体内容的质量提供精细控制;引入自动配置功能,使得局域网管理更方便;增加了专门的网络安全功能。IPv6不是IPv4的简单扩展,而是完全独立的协议。在以太网帧里,IPv4数据报的以太网帧封装类型值是0X800,IPv6数据报的以太网帧封装类型值是0X86dd(详见RFC 2464)。

TCP协议详解

https://my.oschina.net/piorcn/blog/806989
https://blog.csdn.net/dog250/article/details/52962727

TCP服务的特点

由于传输层的协议主要有两个:TCP和UDP。因此后续讨论TCP,会经常与UDP作对比。

1、TCP服务面向连接,一对一,不可为基于广播、多播的应用程序提供服务,而UDP则适合。

2、TCP报文段个数与应用程序读写操作次数之间无明确数量关系,而UDP有。

发送端TCP模块会将上层应用传递的数据放入TCP发送缓存区,后续真正发送数据时,这些数据封装成一个或多个TCP报文段发出。因此TCP报文段与应用程序的写操作次数之间没有固定的数量关系

接收端,应用程序有一个读缓存区,可以一次性将TCP接收缓存区中的数据全部读出,也可以分次读出,这取决于读缓存区的大小。

UDP则不一样,一次写操作对应一个UDP数据报的封装和发送,一次读操作对应一次应用程序缓存区的读取。

形式上,TCP字节流服务中,应用程序的写入函数是send(),读取函数是recv()。UDP数据报服务中,应用程序的写入函数是sendto(),读取函数是recvfrom()。

TCP头部结构

16位端口号, 存着源和目的端口。进行TCP通信时,客户端使用系统自动选择的临时端口号,服务器使用知名服务端口号(所有知名服务使用的端口号都定义在/etc/services中)。

32位序号,一个传输方向上的字节流的每个字节的编号,初始序号是由系统初始化的随机值ISN(Initial Sequence Number)。注意,一个TCP报文段包含一段数据,它的序号值是第一个字节的序号值。

32位确认号,如果A和B在进行TCP通信,A发送出的TCP报文段不仅携带自身序号,还包含对B送来的TCP报文段的确认号!确认号的值是收到的TCP报文段的序号值加一

4位头部长度,标识着该TCP头部有多少个4字节,TCP头部最多15 * 4字节。

6位标志位包含如下几项:

URG标志, 表示紧急指针是否有效。
ACK标志,表示确认号是否有效。称携带ACK标志的TCP报文段为确认报文段。
PSH标志,表示接收端应用程序应该立即从TCP接收缓存区读走数据,为后续数据腾出空间(如果不读走,会一直停留在TCP接收缓存区)
RST标志,表示要求对方重新建立连接。称携带RST标志的TCP报文段为复位报文段。
SYN标志,表示请求建立一个连接。称为同步报文段。
FIN标志,表示通知对方本端要关闭连接了。称为结束报文段。

16位窗口大小,用于流量控制,这里的窗口是接收窗口(Receiver Window,RWND)。用于告诉对方,本端的接收缓存区还能容纳多少字节的数据,这样对方可以控制发送数据的速度。

16位校验和,发送端填充,接收端用CRC算法进行检验(不仅检验头部,还检验数据)。

16位紧急指针,是一个偏移量,该报文段序号值加上这个偏移量表示一个紧急数据的序号,用于发送端向接收端发送紧急数据。

以上是固定字段,占20字节,后面40字节是选项字段,具体可以参考第34页、第35页。

TCP三次握手

可以参考我的这篇博客
https://blog.csdn.net/jojozym/article/details/105101795
值得补充的有:
1、服务器和客户端应用程序判断对方已经关闭连接的方法是:read系统调用返回0(收到FIN报文段)。
2、2MSL(Maximum Segment Life, 报文段最大生存时间),TIME_WAIT状态时长为2MSL,MSL是TCP报文段在网络中的最大生存时间,标准文档RFC 1122的建议值是2 min

TCP状态转移过程

在这里插入图片描述
粗虚线表示服务器端连接的状态转移,粗实现表示客户端连接的状态转移。

在这里插入图片描述
客户端的connect系统调用首先给服务器发送一个SYN报文段,使连接转移到SYN_SENT状态。connect系统调用可能因为以下原因失败:
1、目标端口不存在(未被任何进程监听),或者该端口仍然被处于TIME_WAIT状态的连接所占用,此时,服务器将给客户端发送一个RST报文段,connect调用失败。
2、目标端口存在,但是connect在超时时间内未收到服务器的确认报文段,则connect调用失败。

调用失败则回到CLOSED状态,调用成功则ESTABLISHED。

TCP的复位(RST)报文段

何时会发送RST报文段?
1、一端请求访问另一端的某个不存在或被占用的端口时,另一端会发送RST报文段。
2、应用程序可以使用socket选项SO_LINGER来发送复位报文段,以异常终止一个连接。一旦发送了RST报文段,发送端所有排队等待发送的数据都将被丢弃。
3、假如A是服务器(客户端),B是客户端(服务器),当A关闭或异常终止了连接,B没有接收到结束报文段(比如发生了网络故障),那么B仍然维持着连接,而A哪怕重启,也已经没有该连接的任何信息了。这种状态是半打开状态,处于这种状态的连接叫半打开连接。如果B往半打开连接写入数据,A将回应一个RST报文段。

TCP交互数据流

交互数据仅包含很少的字节,使用交互数据的应用程序(或协议)对实时性要求高,比如telnet、ssh等。

延时确认:客户端针对服务器返回的数据所发送的确认报文段不携带任何应用程序数据,而服务器每次发送的确认报文段都包含它需要发送的应用程序数据。服务器不马上确认收到的数据,而是在一段延迟时间后查看本端是否有数据需要发送,如果有则和确认信息一起发出。延时确认的好处是可以减少发送TCP报文段的数量

Nagle算法:携带交互数据的微小TCP报文段数量很多(一个按键输入就导致一个TCP报文段),这些因素都可能导致拥塞发生。Nagle算法指的是:在一个TCP连接中,通信双方在任意时刻最多只能发送一个未被确认的TCP报文段,在该报文段的确认到达之前不能发送其他TCP报文段,在等待确认时,收集本端需要发送的微量数据,

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值