TCP/IP 协议
TCP/IP 协议(传输控制协议 / 网际协议)是互联网中基本的通信语言和协议。在网络中传输如由计算机 A 发送消息到计算机 B 时,在计算机 A 和计算机 B 两端都会提供 TCP/IP 副本。
TCP/IP 是两层(网络层和传输层)的协议。计算机 A 通过 TCP 将消息拆分成许多包,即分片。然后通过网络层将这些包传输到计算机 B 。计算机 B 通过 TCP 将消息重组,还原成原来的消息。网络层通过 IP 协议,它会处理每个包,使这些包正确的到达目的地,网络上的计算机会更具消息的地址进行路由选择。即使来自同一消息的包,路由的途径不同,但是他们在同一目的地汇合。
一、
IP 报文格式 :
IP 协议是 TCP/IP 协议族中最为核心的协议。它提供不可靠、无连接的服务。在局域网环境, IP 协议往往被封装在以太网帧中传送。而所有的 TCP 、 UDP 、 ICMP 、 IGMP 数据都被封装在 IP 数据报中传送。
二、 IP 头部格式:
Ø 版本( Version )字段:占 4 比特。用来表明 IP 协议实现的版本号,当前一般为 IPv4 ,即 0100 。
Ø 报头长度( Internet Header Length , IHL )字段:占 4 比特。是头部占 32 比特的数字,包括可选项。普通 IP 数据报(没有任何选项),该字段的值是 5 ,即 160 比特 =20 字节。此字段最大值为 60 字节。
Ø 服务类型( Type of Service , TOS )字段:占 8 比特。其中前 3 比特为优先权子字段( Precedence ,现已被忽略)。第 8 比特保留未用。第 4 至第 7 比特分别代表延迟、吞吐量、 可靠性和花费。当它们取值为 1 时分别代表要求最小延时、最大吞吐量、最高可靠性和最小费用。这 4 比特的服务类型中只能置其中 1 比特为 1 。可以全为 0 ,若全 为 0 则表示一般服务。服务类型字段声明了数据报被网络系统传输时可以被怎样处理。例如: TELNET 协议可能要求有最小的延迟, FTP 协议(数据)可能要求有最大吞吐量, SNMP 协议可能要求有最高可靠性, NNTP ( Network News Transfer Protocol ,网络新闻传输协议)可能要求最小费用,而 ICMP 协议可能无特殊要求( 4 比特全为 0 )。
Ø 总长度字段:占 16 比特。指明整个数据报的长度(以字节为单位)。最大长度为 2 的 16 次方,即 65535 字节。
Ø 标识字段:占 16 比特。用来唯一地标识主机发送的每一份数据报。通常每发一份报文,它的值会加 1 。
Ø 标志字段:占 3 比特。标志一份数据报是否要求分段。
Ø 段偏移字段:占 13 比特。如果一份数据报要求分段的话,此字段指明该段偏移距原始数据报开始的位置。
Ø 生存期( Time To Live, TTL )字段:占 8 比特。用来设置数据报最多可以经过的路由器数。由发送数据的源主机设置,通常为 32 、 64 、 128 等。每经过一个路由器,其值减 1 ,直到 0 时该数据报被丢弃。
Ø 协议字段:占 8 比特。指明 IP 层所封装的上层协议类型,如 ICMP ( 1 )、 IGMP ( 2 ) 、 TCP ( 6 )、 UDP ( 17 )等。
Ø 头部校验和字段:占 16 比特。内容是根据 IP 头部计算得到的校验和码。计算方法是:对头部中每个 16 比特进行二进制反码求和。(和 ICMP 、 IGMP 、 TCP 、 UDP 不同, IP 不对头部后的数据进行校验)。
Ø 源 IP 地址、目标 IP 地址字段:各占 32 比特。用来标明发送 IP 数据报文的源主机地址和接收 IP 报文的目标主机地址。
Ø 可选项字段:占 32 比特。用来定义一些任选项:如记录路径、时间戳等。这些选项很少被使用,同时并不是所有主机和路由器都支持这些选项。可选项字段的长度必须是 32 比特的整数倍,如果不足,必须填充 0 以达到此长度要求。
三、
TCP 数据段格式
TCP 是一种可靠的、面向连接的字节流服务。源主机在传送数据前需要先和目标主机建立连接。然后,在此连接上,被编号的数据段按序收发。同时,要求对每个数据段进行确认,保证了可靠性。如果在指定的时间内没有收到目标主机对所发数据段的确认,源主机将再次发送该数据段。
Ø 源、目标端口号字段:占 16 比特。 TCP 协议通过使用 " 端口 " 来标识源端和目标端的应用进程。端口号可以使用 0 到 65535 之间的任何数字。在收到服务请求时,操作系统动态地为客户端的应用程序分配端口号。在 服务器 端,每种服务在 " 众所周知的端口 " ( Well-Know Port )为用户提供服务。
Ø 顺序号字段:占 32 比特。用来标识从 TCP 源端向 TCP 目标端发送的数据字节流,它表示在这个报文段中的第一个数据字节。
Ø 确认号字段:占 32 比特。只有 ACK 标志为 1 时,确认号字段才有效。它包含目标端所期望收到源端的下一个数据字节。
Ø 头部长度字段:占 4 比特。给出头部占 32 比特的数目。没有任何选项字段的 TCP 头部长度为 20 字节;最多可以有 60 字节的 TCP 头部。
Ø
标志位字段( U 、 A 、 P 、 R 、 S 、 F ):占 6 比特。各比特的含义如下:
◆URG :紧急指针( urgent pointer )有效。
◆ACK :确认序号有效。
◆PSH :接收方应该尽快将这个报文段交给应用层。
◆RST :重建连接。
◆SYN :发起一个连接。
◆FIN :释放一个连接。
Ø 窗口大小字段:占 16 比特。此字段用来进行流量控制。单位为字节数,这个值是本机期望一次接收的字节数。
Ø TCP 校验和字段:占 16 比特。对整个 TCP 报文段,即 TCP 头部和 TCP 数据进行校验和计算,并由目标端进行验证。
Ø 紧急指针字段:占 16 比特。它是一个偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。
Ø 选项字段:占 32 比特。可能包括 " 窗口扩大因子 " 、 " 时间戳 " 等选项。
四、
UDP 数据段格式
UDP 是一种不可靠的、无连接的数据报服务。源主机在传送数据前不需要和目标主机建立连接。数据被冠以源、目标端口号等 UDP 报头字段后直接发往目的主机。这时,每个数据段的可靠性依靠上层协议来保证。在传送数据较少、较小的情况下, UDP 比 TCP 更加高效。
Ø 源、目标端口号字段:占 16 比特。作用与 TCP 数据段中的端口号字段相同,用来标识源端和目标端的应用进程。
Ø 长度字段:占 16 比特。标明 UDP 头部和 UDP 数据的总长度字节。
Ø 校验和字段:占 16 比特。用来对 UDP 头部和 UDP 数据进行校验。和 TCP 不同的是,对 UDP 来说,此字段是可选项,而 TCP 数据段中的校验和字段是必须有的。
五、
套接字
在每个 TCP 、 UDP 数据段中都包含源端口和目标端口字段。有时,我们把一个 IP 地址和一个端口号合称为一个套接字( Socket ),而一个套接字对( Socket pair )可以唯一地确定互连网络中每个 TCP 连接的双方(客户 IP 地址、客户端口号、服务器 IP 地址、服务器端口号)。
需要注意的是,不同的应用层协议可能基于不同的传输层协议,如 FTP 、 TELNET 、 SMTP 协议基于可靠的 TCP 协议。 TFTP 、 SNMP 、 RIP 基于不可靠的 UDP 协议。
同时,有些应用层协议占用了两个不同的端口号,如 FTP 的 20 、 21 端口, SNMP 的 161 、 162 端口。这些应用层协议在不同的端口提供不同的功能。如 FTP 的 21 端口用来侦听用户的连接请求,而 20 端口用来传送用户的文件数据。再如, SNMP 的 161 端口用于 SNMP 管理进程获取 SNMP 代理的数 据,而 162 端口用于 SNMP 代理主动向 SNMP 管理进程发送数据。
还有一些协议使用了传输层的不同协议提供的服务。如 DNS 协议同时使用了 TCP 53 端口和 UDP 53 端口。 DNS 协议在 UDP 的 53 端口提供域名解析服务,在 TCP 的 53 端口提供 DNS 区域文件传输服务。
六、 TCP 连接建立、释放时的握手过程
TCP 会话通过三次握手来初始化。三次握手的目标是使数据段的发送和接收同步。同时也向其他主机表明其一次可接收的数据量(窗口大小),并建立逻辑连接。这三次握手的过程可以简述如下:
Ø 源主机发送一个同步标志位( SYN )置 1 的 TCP 数据段。此段中同时标明初始序号( Initial Sequence Number , ISN )。 ISN 是一个随时间变化的随机值。
Ø 目标主机发回确认数据段,此段中的同步标志位( SYN )同样被置 1 ,且确认标志位( ACK )也置 1 ,同时在确认序号字段表明目标主机期待收到源主机下一个数据段的序号(即表明前一个数据段已收到并且没有错误)。此外,此段中还包含目标主机的段初始序号。
Ø 源主机再回送一个数据段,同样带有递增的发送序号和确认序号。