TCP/IP
1
、TCP/IP
体系结构
1.1
、互联网络
互连不同的物理网络:不同的传输介质,不同的介质访问方法,不同的物理编址、寻址方法,不同的帧格式
建立软件,使整个网络看起来像一个同构系统
目标:无缝,统一,通用,向用户隐藏异构的细节
1.2
、体系结构与协议栈
应用层:使用TCP/IP提供的通信服务,实现用户进程之间的通信,大多采用客户机/服务器模型进行通信
运输层:实现端-端通信
(1)TCP:提供可靠的、面向连接的端-端通信服务,协议提供差错控制、流量控制、拥塞控制等功能
(2)UDP:提供不可靠的、无连接的、尽力的端-端通信服务,用户提供差错控制、流量控制、拥塞控制等功能
网际层:提供互连网络的“虚拟网络”镜像
(1)IP:提供不可靠的、无连接的、尽力的数据传输服务,用户提供差错控制、流量控制、拥塞控制等功能
(2)ICMP,ARP,RARP
网络接口层:可以使用任何一种可用的网络接口,只要它们支持IP分组的传输
2
、网络接口层
TCP/IP可以运行在大量物理网络上,如:
Ethernet和IEEE 802.x LAN
FDDI
串行线路,SLIP/PPP
X.25/帧中继(Frame Relay)
SONET/SDH
ATM等
关键:运载IP数据报或其它协议的分组
3
、网络层
3.1
、网际协议IP
它是一种不可靠的、无连接的、尽力传送的分组传输协议,每个分组都携带完整的目的地址,每个分组都被单独处理,分组的路由不断变化
尽力传送(best-effort delivery)意味着:
分组可能会丢失
分组到达时会失序
分组可能会重复
分组可能会延迟
需要高层协议解决这些问题
3.1.1
、编址(IP
地址)
网络上的每台主机都有一个IP地址,如果一台主机与多个网络连接,称该主机为multi-home host(多穴主机),每个网络接口有一个IP地址
结构:网络号+主机号
在IPv4中,为一个32位的无符号二进制数,通常用点分十进制数表示,便于记忆使用
(1
)基于类别的编址
A类地址:[1-126].*.*.*,1字节+3字节,适合大规模网络
B类地址:[128-191].*.*.*,2字节+2字节,适合中等规模网络
C类地址:[192-223].*.*.*,3字节+1字节,适合小规模网络
D类地址:[224-239].*.*.*
保留的IP地址(A、B和C类)
网络号 主机号 源地址 目的地址 含义
0 0 Yes No 本网络上的本主机
0 任意 Yes No 本网络上的某主机
全1 全1 No Yes 在本网络进行广播
任意 全1 No Yes 在某网络上进行广播
127 任意 Yes Yes 本地回送测试
路由器使用前3位就可以确定是那一类IP地址,获得网络号和主机号
Internet号码管理机构负责分配网络ID,网络管理机构负责分配主机ID
(2
)IP
子网
子网划分在本地网络内进行,整个网络在外界看来仍然是一个IP网络
将原IP地址中的主机号细分为子网号和主机号,将子网号和主机号合称为本地地址
引入子网掩码,定义将哪些位最为子网号,
32
位
(IPv4)
无符号二进制数子网掩码长度=
IP
地址长度
位=1:对应的IP地址位为网络ID
位=0:对应的IP地址位为主机ID
静态子网划分:同一网络的所有子网使用相同的掩码,易于实现,易于维护,但会浪费地址
例如,使用掩码255.255.255.0,只有4台主机的子网
变长子网划分:同一网络的子网可以使用不同的掩码,更加灵活,节约
IP
地址,将子网部分进一步划分,其它子网不受影响
变长子网划分举例
一个已经分配了一个C类网络地址165.214.32.0的公司。该公司需要把该地址分配给5个不同的网络,每个网络的主机数如下:
1号网络:50台主机
2号网络:50台主机
3号网络:50台主机
4号网络:30台主机
5号网络:30台主机
显然,这种需求不可能通过静态子网划分解决
分成4个子网,每个子网有62台主机
分成8个子网,每个子网有30台主机
为满足需求,应当定义多个子网掩码
使用掩码255.255.255.192,把网络分成4个子网,每个子网有62台主机
使用掩码255.255.255.224,把第4个子网进一步分成2个子网,每个子网有30台主机
(3
)无类别编址
无类别编址允许使用任意大小的网络ID,不分类别
简短的记法:140.247.0.0/16,意味着前16位作为网络ID
需使用一个位向量(掩码)指明网络ID的大小,140.247.0.0/16,其掩码为255.255.0.0
(4)超网
超网指一块连续的网络地址,通常是一块连续的C类网络地址,利用CIDR,利用超网,可以减少路由表的表项
网络号(3字节)+主机号(1字节):C类(/24)地址
11111111 11111111 11110000 00000000:把16个C类子网超级组合在一起
掩码:255.255.240.0
3.1.2
、IP
路由
(1
)IP
路由的类型
两种类型:直接路由和间接路由
直接路由:如果目的主机与源主机连接在同一个物理网络中,它们之间就可以直接交换IP分组,通过直接把IP分组封装到物理网络的帧中就可以实现直接传输,或称为直接路由
间接路由:如果目的主机与源主机未连接在同一个物理网络中,它们之间就需要间接路由,即通过一个或多个路由器(网关)交换IP分组。在某些情况下,同一个物理网络可能会定义多个子网。如果源主机和目的主机连接到相同的物理网络,但在不同的子网定义中,则需要使用间接路由实现它们之间的通信,转发子网间的流量需要一个路由器
(2
)标准的IP
路由选择
在IP路由表中,有三种映射关系:
描述本地连接的网络的直接路由
描述通过一个或多个路由器到达的间接路由
当不能通过上述两种映射发现目的IP网络时,则使用包含直接路由或间接路由的默认路由
3.1.3
、IP
分组
IP网络中传输的分组称为IP数据报,IP提供数据报分段和重组功能
(1
)IP
数据报报头
Identification: 发送方分配的唯一号码,便于重组分段的数据报
Fragment offset: 帮助重组数据报,指明分段在当前数据报中的位置
Protocol: 指明将重装好的数据报发给哪个高层进程,实现复用/解复用
Source IP和Destination IP: 数据报的源和目的主机的32位IP地址
Time to live: 规定数据报的生存期
(2
)分段
当把一个IP数据报从一个主机传输到另一个主机时,它可能通过不同的物理网络,每个物理网络都有一个最大的帧长度,称之为最大传输单元(Maximum Transmission Unit, MTU) 路由器需要对超过MTU的数据报进行分段,每个段都有数据报头,每个段都被当作一个IP数据报单独发送
分段由路由器负责,重组由目的主机负责。目的主机不知道由哪个路由器进行的分段,因此无法请求重发,分段丢失意味着数据报丢失
3.2
、ICMP
网际控制消息协议
3.2.1
、IP
数据报处理中的错误
IP是尽力传输协议,数据报可能会丢失,延迟,重复,失序,被破坏
3.2.2
、ICMP
特征
ICMP用来报告错误,而不是使IP更可靠,可靠性由高层协议实现
ICMP像高层协议一样使用IP,但它是IP的一个组成部分。所有IP模块必须实现ICMP
3.2.3
、ICMP
消息
ICMP消息封装在IP数据报中发送,并回送给原始的源主机
3.2.4
、Path MTU Discovery
IP数据报头中的DF=1,指示不允许分段,如果需要分段,但不允许分段时,ICMP将报告错误信息。利用该机制可以找到不产生错误信息的最大MTU
3.3
、ARP
地址解析协议
ARP实现很大成程度上依赖于网络类型的设备驱动程序,因此通常在网络接口中实现(网卡固件),这样高层协议和应用可以独立使用IP地址,不必考虑硬件地址
IP数据报封装在数据链路层的帧中,MAC帧包括源主机和目的主机的MAC地址,硬件只能识别MAC地址,IP只使用IP地址
问题:如何根据IP地址得到MAC地址?
解决:ARP
采用基于表格的方法,IP-to-MAC地址绑定表,由软件实现IP地址到MAC地址的转换
3.3.1
、ARP
查找算法
ARP允许主机在只知道同一个物理网络上的一个目的主机的IP地址的情况下,找到目的主机的物理地址。
源主机广播发送一个ARP请求,能识别IP地址的目的主机用包含它自己的MAC地址的ARP应答进行响应
3.3.2
、ARP
缓存
为减少广播通信量,使用ARP的计算机都保留一个ARP缓存,存放最近获得的IP地址到MAC地址的绑定,即IP-to-MAC地址绑定表(动态绑定)
每台主机一个表项,一对数据:IP地址,硬件地址(MAC地址)
4
、运输层
网际层实现了IP主机之间的通信,运输层实现了IP主机上进程(端-端)之间的通信
TCP/IP的运输层的两个重要协议:UDP 用户数据报协议,TCP 运输控制协议
4.1
、端口和套接字
IP地址标识了网络上的一台主机,端口标识了主机上的一个进程
4.1.1
、端口
一个端口是一个16位正整数,每个参与通信的进程通过一个或多个端口将自己与TCP或UDP协议对应起来
端口类型:公用端口、注册端口和临时端口
公用端口:属于标准服务器,
1
~
1023
之间
ftp:20/tcp,21/tcp
talnet:23/tcp
http:80/tcp
4.1.2
、套接字(Socket
)
套接字是一个特殊的文件句柄,一个套接字是一个三元组:
<协议,本地地址,本地端口>
例如:
关联是一个五元组,它完整地规定了构成一个连接的两个进程:
<协议,本地地址,端口,远地地址,远地端口>
半关联为下列两者之一:
<协议,本地地址,本地端口> 或
<协议,远地地址,远地端口>
套接字是通信的一个端点(endpoint),既可以被命名,也可以被编址。套接字模型为进程之间的通信提供了一种全双工字节流连接
4.2
、用户数据报协议UDP
基本上,UDP是IP的一个应用接口,它没有为IP增加可靠性、流量控制或差错控制,它仅仅作为发送与接收数据报的一种多路复用器/多路分解器
UDP提供了让应用进程把一个数据报发送到另一个进程的机制,提供无连接的、不可靠的服务,发送进程需要标识出目的进程的IP地址和端口号
4.2.1
、UDP
数据报格式
源端口号(16bit)+目的端口号(16bit)+长度(16bit)+校验和(16bit)+数据
4.2.2
、多路复用和多路分解
UDP软件接收多个进程送来的数据报,将其送给IP层,同时它接收IP层送来的多个UDP数据报,将其送给应用进程。UDP软件与应用进程之间的多路复用与多路分解通过端口机制实现。实现端口的一个简单方法是使用队列,并由端口号标识每个队列
4.3
、传输控制协议TCP
一个面向连接的协议,提供进程(端系统)之间的可靠数据通信服务。它为IP服务增加了面向连接和可靠的特点,TCP使用端口号标识进程
4.3.1
、端口和套接字
TCP使用端口号标识通信的进程,TCP使用套接字标识连接的两个端点。
简单讲,套接字=IP地址 + 端口号
4.3.2
、TCP
服务
与UDP不同,TCP是一种面向流的协议。TCP允许发送进程以节流的形式传递数据,接收进程也把数据当作字节流接收,TCP创造了一种环境,它使得两个进程被一个假想的“管道”连接
由于发送进程和接收进程处理数据的速度不同,TCP需要设置缓存存贮数据(发送缓存和接收缓存)。缓存也用于流量控制和差错控制
IP作为TCP的服务提供者,以分组为单位进行传输。TCP负责对连续的数据流进行分组——称为TCP报文段,TCP为每个报文段添加TCP首部,交给IP层传输。TCP负责报文段的控制(顺序、差错、重发等),所有这些对进程透明
4.3.3
、TCP
功能
(1)流数据传输
(2)可靠性保证:编号、应答、定时器
(3)流量控制:滑动窗口
(4)多路复用:利用端口实现
(5)逻辑连接管理:由套接字标识连接
4.3.4
、编号
用于顺序控制
字节编号:TCP把在每一个方向上传送的数据字节都进行编号,每个方向上的编号是相互独立的,TCP在0~2的32次幂-1之间产生一个随机数作为第一个字节的编号
例如,要发送6000字节数据,随机数为1057,那么字节编号从1057~7056
报文序号:TCP为每个报文段指派一个编号,报文段的序号就是报文段中的第一个数据字节的序号。
确认号:TCP通信是全双工的,每一方还使用确认号对已经接收的字节表示确认,该确认号定义了期望接收的下一个字节的序号,确认号是“累计”的
4.3.5
、TCP
应答
接收方通常每收到一个报文都应答ACK
优化方法:利用“载答” (ACK piggyback),减少通信量;推迟ACK,在收到其它报文后在发送ACK,以节省带宽;200ms定时器超时后发送ACK
4.3.6
、流量控制
让接收方控制发送的速度,它定义了源站点在收到从目的站点发来的确认之前可以发送的数据量
TCP利用滑动窗口协议进行流量控制,TCP的滑动窗口协议是面向字节的
在收到ACK之前,发送端限制所发送的报文的数量。这个数量被称为最大窗口大小(尺寸)
接收窗口:接收缓存,允许接收的最多报文数
发送窗口:也称为公告的窗口,由接收端确定,以控制允许发送的最多报文数,通常小于或等于接收窗口,防止淹没接收端
TCP滑动窗口的大小是动态变化的:
当接收进程消耗数据的速度较快时,接收窗口就扩展,用ACK通知给发送方,使发送方扩展其窗口尺寸
当接收进程消耗数据的速度较慢时,接收窗口就收缩,用ACK通知给发送方,使发送方收缩其窗口尺寸
4.3.7
、差错控制
损坏的报文段:接收端利用校验和检查,若发现错误,丢弃它,发送端超时重发
丢失的报文段:发送端超时重发
重复的报文段:检查序号,若序号相同,则认为重复,丢弃
失序的报文段:不确认失序的报文段,直到收到它以前的报文段为止,若发送端超时重发,接收端丢弃重复的报文段
4.3.8
、拥塞控制
由于资源有限(带宽、缓存、处理能力等),网络会产生拥塞,报文段就会被丢弃,无法到达终点,终点就不会为这些报文段发送确认,发送端只能重发,而重发会进一步加剧拥塞,最后导致系统崩溃
TCP假定报文段丢失的原因是由于网络中发生了拥塞,因此TCP需要找出一种方法来避免拥塞的发生
拥塞窗口(Congestion Window, CWND):它反映了网络的拥塞情况,发送端利用拥塞窗口根据网络的拥塞情况调整数据的发送速度,这样,发送窗口不仅取决于接收端,还取决于网络的拥塞状况,所以,真正的发送窗口值为:真正的发送窗口值=Min(接收窗口值,拥塞窗口值)
公告的窗口(AWND)是接收端强加的流控,与接收端可用的缓存数量有关
拥塞窗口(CWND)是发送端强加的流控,它基于发送端对观察到的网络的拥塞情况的评估
TCP
拥塞控制分为两个阶段:慢开始,拥塞避免
慢开始:用来确定网络的处理能力
当建立一个新连接时,CWND=一个报文段的最大长度。SSTH = 64K字节 (Slow start threshold, 慢开始拥塞窗口阈值)
对于每一个被确认的报文段(超时之前)
CWND= CWND + 一个报文段的最大长度
如果 CWND<=SSTH,继续上一步
慢开始过程其实不慢,拥塞窗口按指数速率增长
例如,发送一个报文段,收到一个确认,拥塞窗口增大为2个报文段。发送2个报文段,收到对两个报文段的确认,拥塞窗口增大为4个报文段。在收到第三次确认后,拥塞窗口增大为8个报文段(23=8)
拥塞避免:若 CWND>SSTH,则进入第二阶段:拥塞避免
在该阶段,采用加法增大(Additive increase)方法线性增长拥塞窗口,而不能再按指数增长。每收到一个ACK(不论是对一个报文段还是多个报文段的确认)
CWND=CWND + Segsize* Segsize/CWND
其中, Segsize:报文段大小
只要是在超时之前,或拥塞窗口达到接收窗口之前收到ACK,就按这种策略继续下去。若在重传定时器超时之前未收到ACK,或收到重复的ACK,就认为出现了拥塞(而不是报文段损坏,因为今天的网络可以看成是无噪声的)
此时采用乘法减小(Multiplicative Decrease)方法缩小拥塞窗口
SSTH=上次拥塞窗口的一半(按指数规律减小)
CWND=1个报文段
重新回到慢开始阶段
这种循环(慢开始、加法增大、乘法减小)不断继续
4.3.9
、TCP
报文段
两个TCP实体之间传输的数据单元
源端口号:指明发送进程的地址
目的端口号: 指明目的进程的地址
序号:本报文段第一个数据字节的编号,初始序号是随机生成的
确认号:期望接收的下一个字节的序号
4.3.10
、TCP
连接管理
包括连接建立、维护和释放
连接建立:三次握手
连接释放:采用不对称释放(四次握手)