当前位置:   article > 正文

程序员必知必会:TCP/IP 协议

程序员必知必会:TCP/IP 协议

1、概念

1、域名系统:DNS 系统是一个分布式数据库,它提供了 IP 地址(115.239.211.112)和主机名(www.baidu.com)之间的映射信息;
2、封装:

  • tcp segement = header(20 bytes) + application data
  • ip packet = header(20 bytes) + tcp segement
  • ethernet frame = header(14 bytes ) + ip packet

3、RFC(Request for Comments):所有关于 Internet 的正式标准都以 RFC 文档出版

协议就是模型,就是规范,是针对某一特定问题域而设计的方案。要想学习业务建模,模型设计,RFC 文档是最佳典范!

4、端口:端口号用来标识互相通信的应用程序,服务器使用知名的端口号,而客户端使用临时设定的端口号。

5、ARP 和 RARP:

6、在各协议的报文格式中,标识 可以理解为 id,标志 一般是 bit 位,用作功能掩码;

7、tcpdump 与 BPF: BSD Packet Filter,分组过滤器

tcpdump 用它来截获和过滤来自一个被置为混杂模式的网络接口卡的分组。

8、计算机时钟

9、FTP:文件传送协议
10、NFS:网络文件系统
11、X 窗口系统,简称为 X:

2、链路层

1、链路层的三个目的:

  • 为 IP 模块发送和接收 IP 数据包;
  • 为 ARP 模块发送 ARP 请求和接收 ARP 应答;
  • 为 RARP 发送 RARP 请求和接收 RARP 应答;

2、链路层协议取决于网络所使用的硬件,如以太网、令牌环网、FDDI,RS-232串行线路等;

3、MTU

串行线路选择 MTU

4、CSMA/CD:冲突检测的载波侦听多路接入;

5、以太网封装:RFC 894

在这里插入图片描述
6、CRC

循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或电脑文件等数据产生简短固定位数校验码的一种散列函数,它是利用除法及余数的原理来作错误侦测的。对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。

通常直接通过硬件生成!

7、最大传输单元 MTU

不同类型的网络,MTU 也不同,以太网的 MTU 为 1500!当 IP Packet 长度超过 MTU 时,要进行分片(fragmentation)。

8、路径 MTU

9、MTU 与线路利用率

MTU 越大,线路利用率越小,因为传输过程中存储各层协议控制信息的协议头长度是固定的。比如 TCP 和 IP 首部都占用 20 个字节。

3、IP:网际协议

IP 协议不可靠、无连接的设计理念,很有启发意义!

1、不可靠:当发生错误时,路由器会丢弃数据报,然后发送 ICMP 消息报给信源,仅此而已!

2、无连接:相同连接上的不同 IP 数据报,独立路由,无序接收。

3、IP 数据报的格式

ip 报文头中的内容大致可分为

  1. 类型:ip协议类型,上层协议类型
  2. 大小:首部长度,总长度
  3. 路由:源/目的IP地址
  4. 管理:TTL,标识,标志,分片偏移,校验
    在这里插入图片描述
  • 地址 :源地址 + 目的地址
  • 版本号: ipv4 or ipv6
  • 首部长度: header length = field * 4 (byte), max(field) = 2 4 2^4 24 - 1 = 15,因此首部最长为 60 个字节,通常该 field 的值为 5,首部长度为 20 字节。
  • 服务类型:最小延迟、最大吞吐量、最高可靠性、最小费用;目前大多数的 TCP/IP 实现(路由器)都不支持 TOS 特性了。
  • 总长度: 数据长度 + 首部长度; 最长不超过 65535 ( 2 16 2^{16} 216 )字节。
  • 标识字段: 相当于该连接上发送的数据报的 id,在分片和重组时会用到。系统每发送一个 IP 数据报,IP 层都要把一个内核变量的值加1,不管交给 IP 层的数据来自 TCP 还是 UDP。
  • TTL: 设置数据报可以经过的最多路由器数;当该字段的值为 0 时,数据报就被丢弃,并发送 ICMP 报文通知源主机。
  • 协议号:传输层协议号;
  • 校验和:用于校验首部信息的完整性和正确性;
  • 其他字段主要用于特定领域,如军事领域。

4、路由表:目的 IP 地址,吓一跳路由器的 IP 地址,标志,网络接口

5、常用工具

ifconfig
netstat
route
traceroute

6、ARP:地址解析协议

使用数据链路的任何网络层都需要遵循数据链路层的寻址机制(基于 MAC)!

ARP:为 ip 地址到对应的硬件地址之间提供动态映射,该过程是自动完成的,一般应用程用户或系统管理员不必关心。

7、ARP 高速缓存: 使用 arp -a 可以查看,每一项的生存时间一般为 20 分钟。

8、RARP 协议:逆地址解析协议

具有本地磁盘的系统引导时,一般是从磁盘上的配置文件(/etc/sysconfig/network-scripts/ )中读取 IP 地址。但是无盘机,则需要采用其他方法来获取 IP 地址。

9、IP 分片

IP 层在发送 IP 数据报之前,先检测连接的路径 MTU,当 IP 数据报长度大于 MTU 时,进行分片。分片可能发生在源主机上,也可能发生在中间路由器上。

分片的重新组装由目的主机的 IP 层负责完成。

6、ICMP:Internet 控制报文协议

1、icmp

功能分类:查询,差错
在这里插入图片描述
2、功能分为两类:查询,差错

3、有些情况不会导致产生 ICMP 差错报文,以防止广播风暴。

4、ping

ping 的目的是为了测试另一台主机是否可达,该程序发送一份 ICMP 回显请求(type = 8)报文到目的主机,并等待目的主机返回 ICMP 回显应答。ping 程序还能测出到这台主机的往返时间。

随着 Internet 安全意识的增强,出现了提供访问控制清单的路由器和防火墙,一台主机的可达性可能不仅仅取决于网络层是否可达,还取决于承载的协议类型(TCP? UDP ? ICMP?)及端口号。

5、traceroute

traceroute 程序可以让我们看到 IP 数据报从一台主机传到另一台主机所经历的路由过程;Traceroute 程序通常会使用 IP 源路由选项(IP 报文头中的可选字段,最多只能放 9 个 ip 地址)。

traceroute 程序使用 ICMP 报文和 IP 首部中的 TTL 字段。

6、IP 路由

IP 路由是实现 TCP/IP 协议的系统(主机或路由器)最基本的功能;路由表项的内容很简单,包括 5 bit 标志,目的 IP 地址(主机、网络、或默认),下一站路由器的 IP 地址。

路由表可以被路由守护程序或 ICMP 重定向报文修改。

7、UDP:用户数据协议

UDP 是一个简单的面向数据报的传输层协议。

1、UDP 首部
在这里插入图片描述

2、DNS 主要使用 UDP,其他还有 TFTP,SNMP,RIP,BOOTP 等

8、DNS:域名系统

1、域名系统(DNS)是一种分布式数据库,它提供主机名字和 IP 地址之间的转换;

2、RFC 1034 说明了 DNS 的概念和功能,RFC 1035 详细说明了DNS 的规范和实现。 DNS 最常用的版本包括解析器和名字服务器)是 BIND(伯克利 Internet 域名服务器)。该服务器称作 named。

3、报文格式
在这里插入图片描述

4、DNS名字服务器无论是使用 UDP 还是 TCP,端口号都是 53.

9、TCP:传输控制协议

TCP 层(传输层)将用户数据(应用层数据)打包成 TCP Segment (报文段),发送给 IP 层并启动一个定时器,另一端对收到的数据进行确认,对失序的数据重新排序,丢弃重复数据;TCP 提供端到端的流量控制,和强制性的端到端检验和。

1、 面向连接:tcp 连接是虚拟连接,而电话连接是物理连接;

  • 数据分割为合适的 segement,发送给 IP 层;
  • 等待确认;超时重传;
  • 接收确认后,再发送确认,三次握手;
  • 保持首部和数据的检验和,这是一个端到端的检验和。
  • 对接收到的数据进行排序
  • 丢弃重复数据
  • 流量控制

2、TCP 首部的格式
在这里插入图片描述

  • 地址:端口号
  • 序号:标识数据字节流
  • 确认序号:
  • 长度:只有首部长度,没有总长度
  • 标志:6 bit
  • 窗口大小:流量控制

3、6 个标志位

  • URG: U,紧急指针有效
  • ACK: A,确认序号有效
  • PSH:P,接收方应该尽快将这个报文段交给应用层
  • RST:R,重建连接
  • SYN:S,同步需要用来发起一个连接;
  • FIN:F,发端完成发送任务

4、MSS

最长见的可选字段,称为 MSS(Maximum Segment Size),通常在连接建立的第一个报文段中指明这个选项,连接的双方都要通告各自的 MSS。

5、建立与终止连接
在这里插入图片描述

  • ISN:初始报文序号,建立连接时,客户端需要为连接选择一个初始序号,RFC 793 指出 ISN 可看做是一个 32 bit 的计数器,每 4ms 加1。当然还有其他实现方式。
  • 需要留意,连接双方的报文序号是独立;
  • 建立一个连接需要三次握手,而终止一个连接需要四次握手,如报文 4,5,6,7;

有关 TCP 报文的确认机制,很有意思,也很值得琢磨:

  1. 报文段 3 发送 ack 后,不会关心 ack 有没有收到,因为如果 ack 没有收到,对方的超时重传机制会被处罚,会再次发送 报文段 2;因此建立连接只需要三次握手就可以了。

6、TCP 的半关闭

TCP 连接是全双工连接,即

  • 通道1 = (A write --> B read)
  • 通道2 = (B write -> A read)

当通道1完成数据发送,可以通过发送一个 FIN 来终止该通道;这个时候,TCP 连接处于半关闭状态;通道2依然有效,B 端仍然可以用通道2来发送数据,但是不能再用它接收数据了。

在网络编程中,如果应用程序不是调用 close 而是调用 shutdown,且第 2 个参数值为 1,则 socket 的 api 支持半关闭。多数情况下,应用程序应该调用 close 终止两个方向的连接。

有些特殊情况,比如客户端已经完成了它的数据发送,但仍要接收来自服务器的数据,这个时候连接只需要维持在一个单工状态就可以了,TCP 的半关闭设计能很好的解决这个问题。当然,也可以用其它方式,比如通过两个 TCP 连接来实现,但有时用半关闭的单连接更好。

7、建立连接的超时

有很多因素会导致建立连接超时,比如网络阻塞,这时需要有超时处理机制。比如,当发送第一个 SYN 后,如果没有收到 ACK 消息,5.8 秒后发送第二条 SYN,然后隔 24 秒发送第三条 SYN。

大多数伯克利系统把建立新连接所需的最长时间限制为 75 秒。

8、TCP 的状态迁移
在这里插入图片描述
上图中总共 11 个状态名,基本与 netstat 命令显示的状态名称一致,符合 RFC 793 中的定义!

TCP 连接建立和连接终止的过程中,客户端与服务器端的状态迁移路线是不同的。

对应的流程图:
在这里插入图片描述
9、TIME_WAIT 状态

TIME_WAIT 状态也称为 2MSL(Maximum Segement Lifetime) 等待状态。MSL 就是报文段被丢弃前在网络中存在的最大时间。RFC 793 指定 MSL 为 2 风中,实际常用值为 30 秒,1 分钟,或 2 分钟。

处理原则:

当 TCP 执行一个主动关闭,并发回最后一个 ACK,该连接必须在 TIME_WAIT 状态停留 2MSL 时长,这样可以让 TCP 再次发送最后的 ACK 以防止这个 ACK 丢失(另一端超时并重发最后的 FIN)。

处于 TIME_WAIT 的端口不能被使用! 在某些情况,使用 socket api 时,可以设置 SO_REUSEAADR 选项,让调用者对处于 2MSL 等待状态的端口进行赋值。

客户端执行主动关闭并进入 TIME_WAIT 是正常的,服务器端通常执行被动关闭,不会进入 TIME_WAIT 状态。如果终止一个已经建立连接的服务器程序,并立即重启服务器程序,服务器端口将会在 2MSL 时间内不可用,所以服务器程序一般都要设置 SO_REUSEAADR 选项。

当设置 SO_REUSEAADR 选项后,尽管端口可用了,但是那个特定的 socket 资源仍然处于 2MSL 等待状态,无法重用!!!

10、平静时间的概念

TCP 在重启后的 MSL 秒内不能建立任何连接,主要是为了防止接收上次连接的垃圾数据。

11、FIN_WAIT_2

为了防止连接在 FIN_WAIT_2 状态无限等待,当连接处于半关闭状态时,设置一个定时器,如果这个连接空闲(没收到应用层传来的数据) 10 分钟 75 秒,TCP 将进入 CLOSED 状态。

12、RST

当报文段发往基准的连接出现错误时,TCP 都会发送一个复位报文段。

  • 目的端口不存在
  • 连接异常终止
  • 检测半打开连接

13、同时打开,同时关闭

14、Nagle 算法

对于一些小的报文段,接收方使用经受时延的确认方法来判断 确认 报文是否可以推迟发送,以便与回送数据(PSH 报文 一起发送。在较慢的广域网环境中,通常使用 Nagle 算法来减少这些小报文段的数目。这个算法限制发送者任何时候只能有一个发送的小报文段未被确认。有时需要禁止 Nagle 算法的功能。

15、数据流的类型:交互式数据流,成块数据流

16、滑动窗口协议:流量控制方法

该协议允许发送方在停止并等待确认前可以连续发送多个分组,由于发送方不必每发送一个分组就停下来等待确认,因此该协议可以加速数据的传输。

使用 TCP 的滑动窗口协议时,接收方不必确认每一个收到的分组。

10、SNMP:简单网络管理协议

1、被管设备:路由器,X 终端,终端服务器,打印机等运行 TCP/IP 协议的设备。

2、MIB(Management Information Base):管理信息库,包含所有代理进程的所有可被查询和修改的参数;

3、SMI(Structure of Management Information):管理信息结构,关于 MIB 的一套公用的结构和表示符号。

4、SNMP(Simple Network Management Protocol):管理进程和代理进程之间的通信协议,包括数据报交换的格式等,一般传输层使用 UDP。

5、SNMP 的五种操作: get-request, get-next-request, set-request, get-response, trap
在这里插入图片描述
SNMP 报文的格式
在这里插入图片描述

6、对象标识符

7、信息管理库

  • system 组
  • if(interface) 组
  • at 组:地址转换组对于所有的系统都是必须的
  • ip 组:
  • icmp 组:
  • tcp 组:

8、ASN.1 与 BER

SNMP 报文的编码采用 ASN.1(Abstract Syntax Notation One) 和 BER(Basic Encoding Rule),BER是一种编码规格说明,描述如何将 ASN.1 类型的值编码成字节串(string of octets)的方法。BER 的数据都由三个域构成:标识域(tag)+长度域(length)+值域(value),简称 TLV 格式。在ASN.1中,也称为Identifier-length-content(ILC)。

ASN.1 可以简单的理解为模型定义语言,类似于 XML schema,JSON schema,SQL ( DDL ) 等。

例如:

Report ::= SEQUENCE {
author OCTET STRING,
title OCTET STRING,
body OCTET STRING,
biblio Bibliography
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

当数据模型定义好了之后,SNMP 使用 BER 将特定类型的数据编码为要传送的比特流。

11、HTTP

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/200868
推荐阅读
相关标签
  

闽ICP备14008679号