1.运输层协议概述
1.1.进程之间的通信
- 运输层向它上面的应用层提供通信服务,属于面向通信部份的最高层
- IP数据报能指明 通信的两端是主机,但真正通信的实体是在主机中的进程。
- 端对端的通信实质上是进程间的通信
- 运输层一个很重要的功能
- 复用:不同的应用进程都可以使用同一个运输层协议传输数据
- 分用:接收方的运输层在剥去报文的首部后能够把这些数据正确交付目的进程
- 网络层与运输层的区别
- 网络层为主机之间提供逻辑通信,而运输层为应用进程之间提供端对端的逻辑通信
- 网络层只对首部差错检验,运输层要对报文进行差错检测
- 运输层需要面向连接的TCP协议,无连接的UDP协议
- 运输层为高层用户屏蔽了下面的网络核心细节
- 采用TCP时,尽管下面的网络不可靠,但逻辑通信相当于一条全双工的可靠信道。
- 采用UDP时,逻辑通信仍是不可靠的
1.2.运输层的两个主要协议
- 用户数据报协议UDP
- 不需要先建立连接
- 虽然不提供可靠交付,但很有效
- 传输控制协议TCP
- 面向连接的服务
- 可靠交付
- 开销大
1.3.运输层端口
- 在协议栈层间的抽象的协议端口是软件端口
- 软件端口是应用层的各种协议进程与运输实体进行层间交互的一种地址
- TCP/IP使用16位的端口号
- 端口号只具有本地意义,标志的是本机中的进程。
- 不同主机相同进程号是没有关联的
- 端口号分类
- 服务端使用的端口号
- 熟知端口号(系统端口号):0-1023
- 21:FTP
- 23:TELNET
- 25:SMTP
- 53:DNS
- 69:TFTP
- 80:HTTP
- 161:SNMP
- 162:SNMP(TRAP)
- 443:HTTPS
- 登记端口号:1024-49151
- 熟知端口号(系统端口号):0-1023
- 客户端使用的端口号:49152-65535
- 短暂端口号,通信结束后就注销,供给其他进程使用
- 服务端使用的端口号
2.用户数据报协议UDP
2.1.概述
- 无连接的:所以不需要使用套接字建立连接,TCP需要两个套接字
- 不保证可靠交付
- 面向报文:保留边界(不分片,IP处理)
- 没有拥塞控制
- 支持一对一,一对多,多对一,多对多
- 首部开销小,8字节
2.2.首部格式
- 总共8个字节,4个字段,一个2字节
- 源端口:需要对方回信时选用,不用则0
- 目的端口
- 长度:用户数据报长度,最小8字节(只有首部)
- 检验和:全检验,首部——数据
3.传输控制协议TCP
3.1.主要特点
- 面向连接
- 每条TCP连接只能有两个端点:点对点
- 可靠交付
- 全双工
- 面向字节流
- TCP可以划分片,再传给IP
3.2.TCP连接
TCP把连接作为最基本的抽象
TCP所谓的点对点叫做:套接字socket:(IP地址:端口号)
每一条TCP连接唯一的被通信两端点确定
3.3.可靠传输工作原理
- 理想的传输条件的特点:
- 传输信道不产生差错
- 不管发送方的速度多少,接收方总能处理
3.3.1.停止等待协议
- 即发送完一个分组就停止,等待对方确认
- 出现差错时:
- 超时重传:发送方过了一段时间未收到确认信息,就认为信息丢失,重传。超时计时器
- 发送方在发送完一个分组后,必须暂时保留已发送的副本
- 分组和确认分组都要编号
- 超时计时器的时间应该比数据在分组传输的品军防范时间更长一些
- 确认丢失和确认迟到
- 假设接收方在发送 确认信号后 ,再次收到了相同编号的数据报,要采取两个动作
- 丢弃这个重复分组
- 向A发送确认
- 假设接收方在发送 确认信号后 ,再次收到了相同编号的数据报,要采取两个动作
- 通过以上这些,就可以在不可靠的传输网络实现可靠的通信,称之为自动重传请求ARQ
- 信道利用率:发送时长/(发送市场+往返市场+接收方发送确认信号的时长)
3.4.连续ARQ协议
- 即 流水线传输
- 发送窗口(多个)
- 接收方采用累计确认
- 实现容易,但不能向发送方反映出接收方已经正确收到的所有分组的信息(中间出错,中间后面的需要全部重传)
3.5.TCP报文段的首部格式
- 固定20字节
- 源端口和目的端口 : 各占2字节
- 序号:4字节,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号
- 确认号:期望收到对方下一个报文段的第一个数据字节的序号
- 若确认号为N,则表示N-1为止的所有数据都以正确接收
- 数据偏移:4位,指出TCP报文段的首部长度。
- 数据偏移的单位是32位字,即4字节,4位能表示的最大数为15,则首部最大长度为60字节
- 保留:6位。今后使用
- -----------下面为6个控制位----------
- 1
- 推送PSH:当发送方需要立即回复时,可以PSH置1
- 复位RST:1表示TCP连接中出现严重差错,必须释放连接,重置
- 同步SYN:SYN为1,ACK为0时表示这是一个连接请求报文,若对方同意,则在响应的报文段中使得两个都为1,表示这是一个连续请求报文
- 终止FIN:1表示发送完毕,并释放连接
- ---------控制位结束----------------------
- 窗口:占2字节,接收窗口(而不是发送窗口)。窗口值作为接收方让发送方设置其发送窗口的依据(动态变化)
- 校验和:2字节,全校验
- 紧急指针:2字节,仅在URG置1时有意义,指出了紧急数据的位置
- 即使窗口为0,也可以发送紧急数据
- 选项:长度可变,40字节(扩展首部)
- 最大报文段长度MSS:每一个TCP报文段中的数据字段(不包括首部)的最大长度、
- ······
3.6.TCP可靠传输的实现
3.6.1.以字节为单位的滑动窗口
3.6.2.超时重传时间RTO的选择
- RTT:报文段的往返时间
- RTTS:加权平均往返
- RTO略大于RTTs
- 如果报文重传的,就不采用其往返时间作为样本(防止影响RTTs)
3.6.3.选择确认SACK
3.7.TCP流量控制
3.7.1.利用滑动窗口实现流量控制
- 流量控制:让发送方的发送速率不要太快,接收方要来得及接收
- 发送方决定接收方窗口
- TCP窗口单位是字节,不是报文段
- 会产生死锁,解决:
- TCP会为每一个连接设有一个持续计时器
- 会发送零窗口探测报文段
3.8.TCP的拥塞控制
- 需求>可用
- 拥塞控制:防止过多的数据注入到网络中,防止过载。
- 这是一个全局性的过程
- 流量控制往往是点对点通信量的控制,端对端的问题
3.8.1.TCP拥塞控制方法
- 方法:
- 慢开始
- 拥塞避免
- 快重传
- 快恢复
- 慢开始和拥塞避免
- 基于窗口的控制,拥塞窗口
- 原则:只要网络没有出现拥塞,拥塞窗口就可以在增大一些。但只要出现拥塞或者可能出现拥塞,就要减小
- 判断拥塞的依据:是否超时
- 慢开始:每经过一个传输轮次,拥塞窗口cwnd就翻倍。2的指数增长
- 为防止 慢开始 的过度增长,设置一个 慢开始门限ssthresh,达到ssthresh后就执行拥塞避免
- 拥塞避免:每经过一个传输轮次,拥塞窗口cwnd就+1
- 当随着窗口增多,出现超时(严重),将ssthresh设置为cwnd的一半,窗口数从1开始,慢开始增长
- 快重传和快恢复
- 当随着窗口增多,出现三次ACK确认未回复( 信息丢失,可能不是拥塞,不严重),执行快重传和快恢复
- 快重传:收到三个相同的重复确认,立刻重传该报文。并进行快恢复
- 快恢复:将ssthresh设置为cwnd的一半,拥塞避免增长,(+1增长)
3.9.TCP的运输连接管理
运输连接有三个阶段:连接建立,数据传输,连接释放
-
TCP连接建立过程中要解决三个问题:
- 每一方能明确知道对方的存在
- 允许双方协商参数
- 资源分配
TCP建立的访问方式:C/S
3.9.1.TCP的连接建立
- 握手:TCP建立连接的过程。要交换三个TCP报文段。
- !三报文握手表示:一次握手。不是三次握手!
- 一次握手(三报文握手)的过程:
- A—>B
- A创建传输控制模块TCB,向B发送请求,SYN=1,初始序号seq=x。
- TCP规定,该报文段不可携带数据,但要消耗一个序号
- B收到后,同意连接,向A发送确认,SYN=1,ACK=1,ack=x+1,也为自己选择一个初始序号seq=y
- TCP规定,该报文段不可携带数据,但要消耗一个序号
- 这时TCP进程进入SYN-RCVD(同步收到)状态
- A收到确认后,还要再给B发出确认。ACK=1,ack=y+1,seq=x+1
- TCP规定,该报文段可以携带数据,如果不携带,则不消耗序号,下一个数据报文段的序号仍是seq=x+1
- 最后这次确认是为了,防止已失效的连接请求报文突然又传送到了B,产生错误
3.9.2.TCP的连接释放
- 过程:
- 双方都可主动释放连接
- A向TCP发出连接释放报文段,FIN=1,seq=u.
- A进入FIN-WAIT-1状态,等待B的确认,FIN会消耗序号
- B收到后发送确认,ack=u+1,seq=v
- B进入了CLOSE-WAIT关闭等待状态
- TCP服务器通知高层,连接释放了,此时TCP的连接属于半关闭,A不可发送数据,但B向A发,A还是要收
- 若B没有需要发送的数据,就通知TCP释放连接
- B发送报文:FIN=1,seq=w,ack=u+1
- B进入了Last-ack最后确认,等待A确认
- A收到后,发出确认,ACK=1,ack=W+1,seq=u+1
- 到现在,TCP也释放,进入TIME-WAit状态。必须经过 时间等待计时器的时间2MSL A才进入Closed状态
- MSL:最长报文寿命
- 这是为了保证A发送的最后一个ACK报文段能到达B
- 以上为四报文握手