计算机网络原理-传输层
一、传输层的基本服务
1.传输层功能
应用进程之间提供端到端的逻辑通信服务,只有主机才有传输层,网络核心中的中间系统只用到下三层(物理层、数据链路层、网络层) 的功能
- 对应用层报文进行分段和重组
- 面向应用层实现复用与分解
- 实现端到端的流量控制
- 拥塞控制
- 传输层寻址
- 对报文进行差错检测
- 实现进程间端到端可靠数据传输控制
2.传输层寻址与端口
- 一台计算机中,不同应用进程用进程标识符(进程ID)来区分,在全网范围内利用IP地址+端口号唯一标识一个通信端点。
- 传输层端口号为16位整数,可以编号65536(2的16次方)
- 常用端口号:端口号小于256的端口
范围 | 类型 | 属于 |
---|---|---|
0 ~ 1023 | 熟知端口号 | 服务器端口号 |
1024 ~ 49151 | 登记端口号 | 服务器端口号 |
49152 ~ 65535 | 短暂端口号 | 客户器端口号 |
二、传输层的复用与分解
复用与分解:支持众多应用进程共用同一个传输层协议,并能够将收到的数据准确交付给不同的应用进程
1.无连接的多路复用与分解
用户数据报协议(User Datagram Protocol, UDP):Internet 提供无连接服务的传输层协议
- UDP套接字二元组:<目的IP地址,目的端口号>
2.面向连接的多路复用与分解
传输控制协议(Transmission Control Protocol, TCP): Internet提供面向连接服务的传输层协议
- TCP套接字四元组:<源IP地址,源端口号,目的IP地址,目的端口号>
三、停-等协议与滑动窗口协议
1.可靠数据传输基本原理
不可靠传输信道在数据传输中可能发生:
- 比特差错
- 乱序
- 数据丢失
基于不可靠信道实现可靠数据传输采取的措施:
- 差错检测:利用编码实现数据报传输过程中的比特差错检测
- 确认:接收方向发送方反馈接收状态。ACK(肯定确认);NAK(否定确认)
- 重传:发送方重新发送接受方没有正确接收的数据
- 序号:确保数据按序提交
- 计时器:解决数据丢失问题
2.停-等协议
- 停-等协议工作流程
- 发送方发送经过差错编码和编号的报文段,等待接收方确认
- 接收方如果差错检测无误且序号正确,则接受报文段,并向发送方发送ACK,否则丢弃报文段,并向发送方发送NAK
- 发送方如果接受到ACK,则继续发送后续报文,否则重发刚刚发送的报文段。
3.滑动窗口协议
流水线协议(管道协议):允许发送方在没有收到确认前连续发送多个分组。最典型的流水线协议:滑动窗口协议
滑动窗口协议,根据窗口的大小,可以分为:
回退N步协议:GBN协议(Go-Back-N)
- 发送端缓存能力高,可以在没有得到确认前发送多个分组
- 接收端缓存能力很低,只能接受1个按需到达的分组,不能缓存未按序到达的分组
- 发送窗口 >=1, 接收窗口 =1
- 累计确认
选择重传协议:SR协议(Selective Repeat)
- 发送端缓存能力高,接收端缓存能力高
- 发送窗口 >1, 接收窗口 >1
- 逐个确认
四、用户数据报协议(UDP)
用户数据报协议(UDP):Internet传输层协议,提供无连接、不可靠、数据报尽力传输服务。
1.UDP特点
- 应用进程容易控制发送什么数据以及何时发送,会出现分组的丢失和重复
- 无需建立连接
- 无连接
- 首部开销小,只有8个字节(Byte)
2.UDP数据报结构
UDP首部四个字段,每个字段长度都是2个字节,共8个字节
- 源端口号和目的端口号:UDP实现复用和分解
- 长度:UDP报文段中的字节数(首部和数据的总和)
- 校验和:接收方使用来检测数据报是否出现差错
3.UDP校验和
计算规则
- 所有参与运算的内容按照16位对齐求和
- 求和过程中遇到溢出(即进位)都被回卷(即进位与和的最低位再相加)
- 最后得到的和取反码,就是UDP的校验和,填入UDP数据报的校验和字段
参数运算的内容
- UDP伪首部(只在计算校验和使用,发送时不包含 )
- UDP首部
- 应用数据
五、传输控制协议(TCP)
传输控制协议(Transmission Control Protocol, TCP):Internet传输层协议。提供面向连接、可靠、有序、字节流传输服务
- 应用进程先建立连接
- 每一条TCP连接只有两个端点
- 可靠交付:无差错、不丢失、不重复、按序到达
- 全双工通讯
- 面向字节流
1.TCP报文段结构
- 源端口号字段、目的端口号字段个占16位,复用和分解上层应用的数据
- 序号字段、确认序号字段各占用32 位
- 序号字段:TCP序号是对每个应用层数据的每个字节进行编号
- 确认序号字段:期望从对方接收数据的字节序号,即该序号对应的字节尚未收到
- 首部长度:占4位。指出TCP段的首部长度,以4字节为计算单位,长度在20~60个字节之间
- 保留字段:占6位。保留为今后使用, 目前值为0
- URG/ACK/PSH/RST/SYN/FIN各占1位。为标志位字段,各占1位,取值0或1
- 紧急URG = 1, 紧急指针字段有效,优先传送
- 确认ACK = 1,确认序号字段有效,ACK=0,确认序号字段无效
- 推送PSH = 1,尽快将报文段中的数据交付接收应用进程,不要等缓存满了再交付
- 复位RST = 1,TCP连接出现严重差错,释放连接,再重新建立TCP连接
- 同步SYN = 1,该TCP报文段是一个建立新连接请求控制段或同意建立线连接的确认段
- 终止FIN = 1,TCP报文段的发送端数据已经发送完毕,请求释放连接
- 接收窗口字段:占16位。向对方通告我方接收窗口的大小。实现TCP的流量控制
- 校验和字段:占16位。计算方法与UDP校验和的计算方法相同
- 紧急指针字段:占16位。URG =1时,才有效,支出在本TCP报文段中紧急数据共有多少个字节
- 选项字段长度可变,最短为0字节,最长为40字节
2.TCP连接管理
1. 连接建立(3次握手)
第一次握手,客户端向服务期发送连接请求段:(SYN=1,seq=x)
- SYN=1:建立连接请求控制段
- seq=x:表示传输的报文段的第1个数据字节的序列号是x,此序列号代表整个报文段的序号(补充:sequence number,序号的意思)
第二次握手,服务器发回确认报文段:(SYN=1,ACK=1,seq=y,ack_seq=x+1)
- SYN=1:同意建立新连接的确认段
- ACK=1:确认序号字段有效
- seq=y:服务器告诉客户确认报文段的序列号是y
- ack_seq=x+1:表示已经收到了序列号为x的报文段,准备接收序列号为x+1的报文段。服务器由LISTEN进入SYN_REVD(同步收到)
第三次握手,客户端对服务器的同意连接报文段进行确认:(ACK=1,seq=x+1,ack_seq=y+1)
- ACK=1:确认序号字段有效
- seq=x+1:客户此次的报文段的序列号是x+1
- ack_seq=y+1:客户期望及手段服务器序列号为y+1的报文段
总结
- 第一次握手:客户发送请求,此时服务器知道客户能发
- 第二次握手:服务发送确认,此时客户知道服务器能收能发
- 第三次握手:客户发送确认,此时服务器知道客户能收
补充
- 当客户端发送ACK时,客户端进入ESTABLISHED状态
- 当服务端收到ACK时,也进入ESTABLISHED状态
- 第三次握手客户端可携带数据
2. 连接断开(4次挥手)
第一次挥手,客户向服务器发送释放连接报文段:(FIN=1,seq=u)
- FIN=1:发送端数据发送完毕,请求释放连接
- seq=u:传输的第一个数据字节的序号是u
- 客户端状态由ESTABLISHED进入FIN_WAIT_1(终止等待1状态)
第二次挥手,服务器向客户发送确认段:(ACK=1,seq=v,ack_seq=u+1)
- ACK=1:确认字号段有效
- ack_seq=u+1:服务器期望接收客户数据序号为u+1
- seq=v:服务器传输的数据序号是v
- 服务器状态由ESTABLISHED进入CLOSE_WAIT(关闭等待)
- 客户端收到ACK后,由FIN_WAIT_1进入FIN_WAIT_2
第三次挥手,服务器向客户发送释放连接报文段:(FIN=1,ACK=1,seq=v+1,ack_seq=u+1)
- FIN=1: 请求释放连接
- ACK=1: 确认字号段有效
- ack_seq=u+1:服务器期望接收客户数据序号为u+1
- seq=v+1: 表示自己传输的第一个数据字节序号是v+1
- 服务器状态由CLOSE_WAIT进入LAST_ACK(最后确认)
第四次挥手,客户向服务器发送确认段:(ACK=1,seq=u+1,ack_seq=v+1+1)
- ACK=1:确认序号段有效
- ack_seq=v+1+1:表示客户期望接收服务器数据序号是v+1+1
- seq=u+1:表示客户传输的数据序号是u+1
- 客户端由FIN_WAIT_2进入TIME_WAIT,等待2MSL时间,进入CLOSED
- 服务器在收到最后一次ACK后,由LAST_ACK进入CLOSED
3.TCP可靠数据传输
可靠:保证接收方应用进程从缓冲区读出的字节流与发送方发出的字节流是完全一样的
TCP实现可靠数据传输的工作机制:
- a. 分段:应用层数据被分割成TCP认为最合适发送的数据块;最大报文段长度(Maximum Segment Size, MSS),报文段中封装的应用层数据的最大长度,MSS不包含TCP首部长度
- b. 序号:发送方对发送的数据报进行编号,确保数据按序提交给接收方,一个字节占用一个序号,序号字段指的就是一个报文段第一个字节的序号
- c. 确认:接收方向发送方反馈接收状态,确认是否正确接收数据,TCP采取累积确认
- d. 差错检测:利用差戳编码实现数据报传输过程中的比特查错检测(甚至纠正)
- e. 重传:发送方重新发送接收方没有正确接收的数据
- d. 计时器:在发送方引入计时器,解决数据丢失问题
4.TCP流量控制
协调发送方与接收方的数据发送与接收速度,在通信过程中,接收方设置报文段的接收接收窗口字段来将窗口大小通知给发送方
5.TCP拥塞控制
拥塞:太多的主机以太快的速度向网络中发送太多的数据,超出了网络处理能力,导致大量数据分组拥挤在中间设备队列中等待转发,网络性能显著下降的现象
拥塞预防策略:流量整形技术,规范主机向网络发送数据的流量
拥塞控制:通过合理调度、规范、调整向网络中发送数据的主机数量、发送速率、数据量,以避免拥塞或消除已发生的拥塞
概念补充
- 拥塞窗口(CongWin):连接开始,CongWin=1MSS, MSS:1个最大报文段长度(Maximum Segment Size)
- 阈值(Threshold):临界值
TCP拥塞控制的算法
- 慢启动:在TCP连接建立时,每经过1个RTT,拥塞窗口值增大一倍
- 拥塞避免:当拥塞窗口大于等于阈值时,每经过1个RTT,拥塞窗口值加1
- 快速重传:接收端收到3次重复确认,则推断被重复确认的报文段已经丢失,于是立即发送被重复确认的报文段
- 快速恢复
当发生3次重复确认时,网络拥塞程度不是很严重
- 新的阈值为当前拥塞窗口的一半
- 新的拥塞窗口调整为新的阈值
- 不在重新从慢启动阶段开始,而是直接从新的阈值开始,直接进入拥塞避免阶段
当发生计时器超时
- 新的阈值为当前拥塞窗口的一半
- 闲的拥塞窗口直接调整为1MSS
- 重新从慢启动阶段开始
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!