TCP/IP详解
网络协议通常分不同层次进行开发,每一层分别负责不同的通信功能
一个协议族,比如TCP/IP,是一组不同层次上多个协议的组合
TCP/IP通常被认为是一个四层组织协议
- 链路层,有时也称作数据链路层和网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡
- 网络层,有时也称作互联网层,处理分组在网络中的活动。在TCP/IP协议族中,网络层协议包括IP协议(网际协议),ICMP协议(Internet互联网控制报文协议),IGMP协议(Internet组管理协议)
- 运输层主要为两台主机上的应用程序提供端到端的通信。TCP和UDP
应用层负责处理特定的应用程序细节
TCP:传输控制协议
TCP提供一种面向连接的、可靠地字节流服务
TCP通过下列方式来提供可靠性
- 应用数据被分割成TCP认为最适合发送的数据块
- 自适应的超时及重传
- 当TCP收到发自TCP连接另一端的数据,它将发送一个确认(这个确认通常会推迟几分之一秒)
- TCP将保持它首部和数据的检验和
- TCP报文段是作为IP数据包来传输的,因此到达可能会失序。如果必要,TCP将对收到的数据进行重新排序
- 接收端丢弃重复的数据
- 提供流量控制
TCP的首部
TCP数据被封装在一个IP数据报中
TCP首部的数据格式。如果不计任何字段,它通常是20个字节
一个IP地址和一个端口号也称为一个socket,socket pair可唯一确定互联网络中每个TCP连接的双方。
序号用来标识从TCP发端向TCP收端发送的数据字节流,它表示在这个报文段中的第一个数据字节。
当建立一个新的连接时,SYN标志变为1。
- URG 紧急指针有效
- ACK 确认序号有效
- PSH 接收方应该尽快将这个报文段交给应用层
- RST 重建连接
- SYN 同步序号用来发起一个连接
- FIN 发端完成发送任务
TCP连接的建立和终止
三次握手
1 请求短发送一个SYN段指明客户打算连接的服务器端口,以及初始序号(ISN)
2 服务器发回包含服务器的初始序号的SYN报文段作为应答。同时,将确认序号设置为客户的ISN+1以对客户的SYN报文段进行确认。一个SYN将占用一个序号
3 客户必须将确认序号设置为服务器的ISN+1以对服务器的SYN报文段进行确认
连接终止
1 进行关闭的一方发送第一个FIN
2 服务器收到FIN,发回一个ACK,确认序号为收到的序号+1。和SYN一样,一个FIN将占用一个序号。
3 同时TCP服务器还向应用程序传送一个文件结束符。接着这个服务器就关闭它的连接,导致它的TCP端发送一个FIN。
4 客户必须发回一个FIN,并将确认序号设置为收到序号+1。
最大报文长度
最大报文长度(MSS)表示TCP传往另一端的最大数据块的长度。
MSS让主机限制另一端发送数据报的长度。加上主机也能控制它发送数据报的长度,这将使以较小MTU连接到一个网络上的主机避免分段。
TCP的半关闭
TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力,这就是所谓的半关闭。
TCP的状态变迁图
2MSL等待状态
TIME_WAIT状态也称为2MSL等待状态。
对一个具体实现所给定的MSL值,处理的原则是:当TCP执行一个主动关闭,并发回最后一个ACK,该连接必须在TIME_WAIT状态停留的时间为2倍的MSL。
这种2MSL等待的另一个结果是这个TCP连接在2MSL等待期间,定义这个连接的插口不能再被使用。这个连接只能在2MSL结束后才能再被使用。
平静时间的概念
TCP在重启后的MSL秒内不能建立任何连接
FIN_WAIT_2
只有当另一端的进程完成这个关闭,我们这端才会从FIN_WAIT_2状态进入TIME_WAIT状态。
复位报文段
TCP首部中的RST是用于复位的。一般来说,无论何时一个报文段发往基准的连接出现错误,TCP都会发出一个复位报文段。
- 到不存在的端口的连接请求
- 异常终止一个连接
- 检测版打开连接
TCP的成块数据流
TCP使用滑动窗口协议来进行流量控制。该协议允许发送方在停止并等待确认前可以连续发送多个分组。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输。
1 发送方不必发送一个全窗口大小的数据
2 来自接收方的一个报文段确认数据并把窗口向右滑动。因为窗口的大小是相对于确认序号的。
3 窗口的大小可以减小,但是窗口的右边沿却不能向左滑动。
4 接受方在发送一个ACK前不必等待窗口被填满。
PUSH标志
使用API通知TCP设置正在接收数据的PUSH标志或得到该数据是否被设置PUSH标志的信息是不可能的。
慢启动
慢启动为发送方的TCP增加了一个窗口:拥塞窗口,记为cwnd。
当与另一个网络的主机建立TCP连接时,拥塞窗口被初始化为1个报文段。没收到一个ACK,拥塞窗口就增加一个报文段。
发送方取拥塞窗口与通告窗口中的最小值作为发送上限。
拥塞窗口是发送方使用的流量控制,而通告窗口则是接收方使用的流量控制。
宽带时延乘积
通道容量: capatity(bit)=bandwidth(b/s)*round-trip time(s)
拥塞
当数据到达一个大的管道并向一个较小的管道发送时
当多个输入流到达一个路由器,而路由器的输出流小于这些输入流的总和时
TCP的超时与重传
TCP通过在发送时设置一个定时器来解决数据和确认丢失的问题。如果当定时器溢出时还没有收到确认,它就重传该数据。
对每个连接,TCP管理4个不同的定时器:
1 重传定时器使用于当希望收到另一端的确认。
2 坚持(persist)定时器使窗口大小信息保持不断流动,即使另一端关闭了其接收窗口。
3 保活(keepalive)定时器可以检测到一个空闲连接的另一端何时崩溃或重启。
4 2MSL定时器测量一个连接处于TIME_WAIT状态的时间。
往返时间(RTT)
$$ R\leftarrow \alpha R+\left( 1-d\right)M $$
$$ Err=M-A $$
$$ A\leftarrow A+gErr $$
$$ D\leftarrow D+h\left(|Err| -D\right) $$
$$ RTO = A+4D $$
M表示测量得到的RTT
\(\alpha\)是一个推荐值为0.9的平滑因子
A是被平滑的RTT
D是被平滑的均值方差
Err是刚得到的测量结果与当前的RTT估计器之差
增量g起平均作用,取为0.125
偏差的增益是h,取值为0.25具体计算实例参考TCP-IP详解卷一第21章
TCP的坚持定时器
ACK的传输并不可靠,TCP不对ACK报文段进行确认,TCP只确认那些包含有数据的ACK报文段。
如果一个确认丢失了,则双方就有可能因为等待对方而是连接终止:接收方等待接收数据,而发送方在等待允许它继续发送数据的窗口更新。为防止这种死锁情况的发生,发送方使用一个坚持定时器来周期性的向接收方查询,以便发现窗口是否已增大。这些从发送方发出的报文段称为窗口探查。
TCP的保活定时器
如果一个给定的连接在两个小时之内没有任何动作,则服务器就向客户发送一个探查报文段。客户主机必须处于以下4个状态之一:
1 客户主机依然正常运行,并从服务器可达。客户的TCP响应正常,而服务器也知道对方是正常工作的。服务器在2个小时以后将保活定时器复位。如果在两个小时定时器到时间之前有应用程序的通信量通过此连接,则定时器在交换数据后的未来2小时再复位
2 客户主机已经崩溃,并且关闭或者常在重启。在任何一种情况下,客户的TCP都没有响应。服务器将不能够收到对方的探查,并在75秒后超时。服务器总共发送10个这样的探查,每个间隔75秒。如果服务器没有收到一个响应,它就认为客户主机已经关闭并终止连接。
3 客户主机崩溃并已经重新启动。这时服务器将收到一个对其保活探查的响应,但是这个响应是一个复位,使得服务器终止这个连接。
4 客户主机正常运行,但是服务器不可达。与状态2相同