计算机网络 传输层
这里面的二进制反码求和校验算法参考了:https://blog.csdn.net/dingmin1860/article/details/48268927
- ARQ 自动重发请求
- 连续ARQ协议
介绍
传输层是分界层次,以上是面向应用,以下是面向数据传输
根据用户的需求不同~
可靠,面向连接,TCP
不可靠,非面向连接,UDP。快,传输代价小。
端口
16位,0-65535
0-1023 保留的
1024-5000 临时的
通用端口号
FTP | 21/TCP |
DNS | 53/UDP |
HTTP | 80/TCP |
SMTP | 25/TCP |
为什么需要传输层
网络层已经提供传输服务,不可靠,会丢失分组。
需要端主机系统自己实现可靠传输。
几个概念
面向连接服务
无连接服务
可靠服务
反馈重发
传输层的两个协议
- 用户数据报协议 user datagram protocol
- 传输控制协议 transmission control protocol
- 传送的数据单位:报文
UDP
用户数据报协议 user datagram protocol
特点
- 无连接
- 传输单位是报文
- 首部小
- 不可靠
- 接收方不需要发送确认信息
- 不保证数据完整到达目的地
- 减轻网络的通信负担
UDP首部格式
源端口(16位)、目的端口(16)、校验和(16)、消息长度(16)、数据
端口号:16位,允许65535个不同的端口号
校验和:校验范围 UDP数据报头+报文主体+伪报头
消息长度:单位 字节,8字节的UDP头+数据部分,最大长度65535
UDP校验和
伪首部(12字节)
4(字节) | 4 | 1 | 1 | 2 |
---|---|---|---|---|
源IP地址 | 目的IP地址 | 0 | 17 | UDP长度 |
校验和的计算范围:伪首部+UDP首部+数据
12(字节) | 2 | 2 | 2 | 2 | |
---|---|---|---|---|---|
伪首部 | 源端口 | 目的端口 | 消息长度 | 校验和 | 数据 |
计算方法如IP校验和:二进制反码运算
UDP不仅检查了端口号,还检查了IP地址
TCP
传输控制协议 transmission control protocol
特点
面向连接
三次握手协议建立连接
在不稳定的IP网络上建立连接
客户端:主动打开网络连接,发送一个SNY分节,初始化序列号为x
服务器端:被动打开端口,发送SNY y,和ACK x+1
客户端:发送ACK y+1
可靠
反馈重发机制
三种策略
- 停止等待方式
收到一个ACK才能发送下一个包
- 连续工作方式(取决于接收端有没有缓存)
- 拉回方式(有累积确认ACK) go back n
- 选择重发方式
ARQ机制:滑动窗口
计时器
发送方没有在规定时间内收到ACK,则认为超时并且重新发送该数据包。
存在问题:收到重复报文。
接收方可以通过报文序号来去除重复的分组。
连续ARQ协议
- 发送方一次可以发送多个分组
- 接收方一般采用累积确认的方式:对按序到达的最后一个分组发送确认
滑动窗口sliding windows
滑动窗口不仅可以实现连续ARQ协议,还可以进行流量控制(发送方和接收方的速度相匹配)
- 发送方只发送“发送窗口”内的数据
- 接收方只接收“接收窗口”内的数据
面向字节流
滑动窗口
按照字节数进行确认
持续计时器
只要TCP连接的一方A收到对方的零窗口通知,就会启动该持续计时器。
若计时器到期,A发送零窗口探测报文。对方收到后,给出现在的窗口值。
流量控制
发送方发送速率不要太快,既要让接收方来得及接收(防止数据丢失),也不要使网络发生拥塞。
滑动窗口机制在TCP上可以实现流量控制(双方按照一致的速率发送数据)
拥塞控制
基本原理
某段时间内,需求超过资源所能提供的可用部分,网络的性能就会变坏。--->拥塞
解决思路
增加资源,减少需求
TCP拥塞控制
TCP首部格式
最小长度20字节
UDP vs. TCP
拥塞控制 vs. 流量控制
(列了大纲,会补充更新的~!)
二进制反码求和校验算法
参考:https://blog.csdn.net/dingmin1860/article/details/48268927
首先,IP、ICMP、UDP和TCP报文头都有检验和字段,大小都是16bit,算法基本上也是一样的。
在发送数据时,为了计算数据包的检验和。应该按如下步骤:
1、把校验和字段设置为0;
2、把需要校验的数据看成以16位为单位的数字组成,依次进行二进制反码求和;
3、把得到的结果存入校验和字段中
在接收数据时,计算数据包的检验和相对简单,按如下步骤:
1、把首部看成以16位为单位的数字组成,依次进行二进制反码求和,包括校验和字段;
2、检查计算出的校验和的结果是否为0;
3、如果等于0,说明被整除,校验和正确。否则,校验和就是错误的,协议栈要抛弃这个数据包。