面向连接和无连接服务
- 面向连接的服务
通信双方在通信前要先建立一条通信线路,这个过程分为三步:建立连接、使用连接、释放连接。
数据传输时,数据分组不需要携带目的地址。 - 面向无连接的服务
顾名思义,通信双方在通信时无需建立一条通信线路,而是把每个带有目的地址的数据包送到线路上,由系统选定路线进行传输。IP协议和UDP协议就是一种无连接协议。
无连接通信比较迅速、使用灵活、连接开销小,但这种方式可靠性低,不能防止报文丢失、重复或失序。
TCP
传输控制协议(Transmission Control Protocol,TCP)是一种可靠的、面向连接的字节流服务。数据在传输前先在源主机和目的主机之间建立连接。然后在此连接上,被编号的数据段按序收发。同时要求对每个数据段进行确认,保障了可靠性。如果在指定时间内没有收到目标主机对所发数据段的确认,源主机将再次发送该数据段。
TCP三种机制
- 使用序号对数据包进行标记
便于TCP接受服务在向高层传递数据之前调整失序的数据包。 - TCP使用确认、校验和定时器系统提供可靠性。
- 接收者识别出有未到达的数据包后通知发送者。
- 发送者未收到接收者对已发数据的接收确认。
- TCP使用窗口机制调整数据流量
窗口机制可以减少因接收方缓冲区满而造成丢失数据报文的可能性。
TCP报文的首部格式

- 源端口和目的端口
该字段长度均为16位。TCP使用端口号来表示源端和目标端的应用进程,端口号取值范围是0-65535。 - 序列号(报文段序号)
该字段长度位32位,因此序号范围[0,(2^35)-1] 。序号增加到(2^32)-1后,下一个序号就又回到0。TCP是面向字节流的。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。首部中的序号字段值则是指的是本报文段所发送的数据的第一个字节的序号。 - 确认号
32位,是期望收到对方下一个报文段的第一个数据字节的序号。
若确认号为= N,则表明:到序号N-1为止的所有数据都已正确收到。 - 报文头长度
又称数据偏移字段,长度4位,单位32位,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。这个字段实际上是指出TCP报文段的首部长度。由于首部中还有长度不确定的选项字段,因此数据偏移字段是必要的,但应注意,“数据偏移”的单位是32位字(即以4字节的字为计算单位)。由于4位二进制数能表示的最大十进制数字是15,因此数据偏移的最大值是60字节,这也是TCP首部的最大字节(即选项长度不能超过40字节)。 - 保留字段
6位,保留为今后使用,通常置为0。 - 标记
- 紧急URG(URGent),当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快发送(相当于高优先级的数据),而不要按原来的排队顺序来传送。
- 确认ACK(ACKnowledgment) 仅当ACK = 1时确认号字段才有效,当ACK = 0时确认号无效。TCP规定,在连接建立后所有的传送的报文段都必须把ACK置为1。
- 推送 PSH(PuSH),当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应。在这种情况下,TCP就可以使用推送(push)操作。这时,发送方TCP把PSH置为1,并立即创建一个报文段发送出去。接收方TCP收到PSH=1的报文段,就尽快地(即“推送”向前)交付接收应用进程。而不用再等到整个缓存都填满了后再向上交付。
- 复位RST(ReSeT),当RST=1时,表明TCP连接中出现了严重错误(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立传输连接。RST置为1还用来拒绝一个非法的报文段或拒绝打开一个连接。
- 同步SYN(SYNchronization),在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN=1和ACK=1,因此SYN置为1就表示这是一个连接请求或连接接受报文。
- 终止FIN(FINis,意思是“完”“终”),用来释放一个连接。当FIN=1时,表明此报文段的发送发的数据已发送完毕,并要求释放运输连接。
- 窗口
8位。窗口值是【0,2^16-1】之间的整数。窗口指的是发送本报文段的一方的接受窗口(而不是自己的发送窗口)。窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量(以字节为单位)。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。总之,窗口值作为接收方让发送方设置其发送窗口的依据。 - 校验和
长度16位,对整个TCP报文段进行验证,并由目标端进行验证。
9.紧急指针
该字段长度为16位,紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据) 。因此,在紧急指针指出了紧急数据的末尾在报文段中的位置。当所有紧急数据都处理完时,TCP就告诉应用程序恢复到正常操作。值得注意的是,即使窗口为0时也可以发送紧急数据。 - 选项
长度可变,最长可达4字节。当没有使用“选项”时,TCP的首部长度是20字节。
TCP最初只规定了一种选项,即最大报文段长度MSS(Maximum Segment Szie)。注意MSS这个名词含义。MSS是每一个TCP报文段中的数据字段的最大长度。数据字段加上TCP首部才等于整个的TCP报文段。所以MSS并不是整个TCP报文段的最大长度,而是“TCP报文段长度减去TCP首部长度”。
TCP连接建立
在连接建立前通信双方都是closed状态。
- 源主机向目的主机发送请求报文段,其同步标志位为SYN=1,并为自己表明一个初始序号SEQ=x;随后源主机进入同步已发送状态(SYN-SENT)。进入同步已发送状态(SYN-SENT)。
- 目的主机收到请求报文段以后,返回确认报文段,包含:SYN=1,ACK=1,标明序号为seq=y,同时表明期望收到源主机的确认序号即ack=x+1.
- 源主机收到目标主机的确认后吗,在确认报文段中把SYN和ACK都设为1,并返回确认序号ack=y+1,自己的序号为seq=x+1.此时TCP连接建立源主机进入ESTABLISHED状态,目的主机收到确认报文后也会进入该状态。

TCP释放连接

- 源主机向目的主机发送释放报文(FIN=1,SEQ=x)进入释放等待状态(FIN-WAIT)。
- 目的主机收到释放报文发送确认报文,(ACK=1,确认序号ACK=x+1,自身序号SEQ=有)TCP连接进入版关闭状态(HALF-CLOSED)源主机收到确认报文之后等待目的主机发送释放报文。
- 目标机确定无数据发送后,向源主机发送释放报文(FIN=1,ACK=1,ack=x+1,seq=z)
- 源主机收到释放确认报文之后,向目标主机发送确认报文,ACK=1,ack=z+1,SEQ=x+1,源主机进入CLOSED状态,目标主机收到确认报文后进入CLOSED状态。
TCP拥塞控制
源端判断当前网络剩余多少容量。以知道自己可以传送的分组数,防止过多的数据注入网络,避免过载而拥塞。
TCP拥塞机制
- 慢启动与拥塞避免:状态变量,动态变量,发送窗口一般取拥塞窗口的最小值。
- 慢启动
从小到大逐渐增大拥塞窗口的值;刚开始发送报文段是,先把拥塞窗口设置一个最大的报文段MSS的数值,在每收到上一轮报文段的确认后,就把拥塞窗口加倍。
快重传:接收方收到一个失序报文段后,就立即发出重复确认。
快恢复:发送方收到三个重复的报文确认时,慢启动阈值减半;且之后不执行慢启动而是执行拥塞避免线性增加。
早期检测RED:丢失必重传,增加网络负担,TCP传输时延明显。
TCP协议重传时间
超时重传时间:TCP会对传输的数据进行确认,传输过程中会对丢失的数据设置一个超时计时器。
- TCP发送了报文时,便启动计时器
- 计时器超时后。TCP就会重传发送窗口最前端的报文并重启计时器。
- 若TCP发送窗口中没有数据,就停止该计时器,否则重启计时器。
往返时间:数据从发送到到确认所需时间RTT
加权平均往返时间:RTT是随着网络状态变化的,所以使用加权平均往返时间RTTS。
434



被折叠的 条评论
为什么被折叠?



