计算机网络之传输层
传输层
端到端,进程与进程的通信
- 使用端口 (Port) 来标记不同的网络进程
- 端口 (Port) 使用16比特位表示 (0~65535)
UDP协议
- UDP 用户数据报协议
- 数据报:应用层传输过来一个完整的数据
- 对数据报不合并、不拆分
- UDP是一个非常简单的协议
UDP 是无连接协议
UDP 不能保证可靠的交付数据
因为UDP协议头部简单,且无连接想发就发,无法保证数据在网络中是否丢失
UDP 是面向报文传输的
不会对报文做任何处理,而是直接塞进UDP的数据中发送出去
UDP没有拥塞控制
UDP不管网络是否拥塞都会尽量把数据发送出去
UDP的首部开销很小
TCP协议
- TCP 传输控制协议
- TCP协议是计算机网络中非常复杂的一个协议
TCP是面向连接的协议
TCP的一个连接有两端(点对点通信)
TCP提供可靠的传输服务
TCP协议提供全双工的通信
两个连接都可以发送数据的接收数据
TCP是面向字节流的协议
对应该层的数据进行拆分成一段一段的分别发送然后进行合并
可靠传输
可靠传输的基本原理
停止等待协议
发送方给接收方发送消息1后停止,等待接收方发送确认消息后继续发送消息2
出现差错的情况:通过超时重传来保证可靠传输
- 发送消息在路上丢失了
- 确认消息在路上丢失了
- 确认的消息很久才到
超时定时器:每发送一个消息,都需要设置一个定时器
停止等待协议是最简单的可靠传输协议
停止等待协议对信道的利用率不高
连续ARQ协议
- ARQ :自动重传请求
- 批量发送和确认
拥有滑动窗口,批量发送后收到确认再将窗口向前滑动继续发送窗口内的数据
并不需要对每一个报文都确认,而是采用累计确认的方法,比如接收到了5就代表前五个数据已收到,窗口向后滑动五个位置 (大大减少确认报文的数量以提升网络效率)
TCP协议的可靠传输
TCP的可靠传输基于连续ARQ协议
TCP的滑动窗口是以字节为单位的
如果没有按序收到确认号,过超时时间(超时定时器)就会重传
选择重传:选择重传指定需要重传的字节,是一个边界,是一个字节段 (比如TCP报文中的选项存了1000和1500表示重传1000到1500边界的字节)
每一个字节都有惟一的32位序号,TCP报文的序号也是指一个字节段
流量控制
流量控制指让发送方发送速率不要太快
流量控制是使用滑动窗口来实现的
窗口指明允许对方发送的数据量
通过窗口大小控制对方发送速率
- 在向发送方发送确认消息时可以指定窗口的大小(对方可以发送的数据大小),如果指定为0发送方将等待
- 如果在发送方等待,接收方发送窗口大小的消息时消息丢失,就会出现死锁的情况(发送方和接收方都在等待对方传消息),这时需要坚持定时器
坚持定时器
- 当接收到窗口消息为0的消息,则启动坚持定时器
- 坚持定时器每隔一段时间发送一个窗口探测报文
拥塞控制
拥塞
- 一条数据链路经过非常多的设备
- 数据链路层中各个部分都有可能成为网络传输的瓶颈
- 网络对硬件设备的要求大于可用资源导致拥塞
- 流量控制考虑的是点对点通信量的控制
- 拥塞控制考虑整个网络,是全局性的考虑
- 报文超时则认为是拥塞
慢启动算法
由小到大逐渐增加发送数据量(发送数据报文的数量)
每收到一个报文确认,就加一(1 2 4 8 16…)指数增长
当增长到慢启动阈值就不增长了,就会启动拥塞避免算法
拥塞避免算法
- 维护一个拥塞窗口
- 只要网络不拥塞 (报文不超时),就试探着拥塞窗口调大 (16 17 18…)
TCP的拥塞控制还是尽可能结合自身考虑,只要网络不拥塞就尽可能发送更多的数据到网络中去,只要拥塞发生了就减少自己所发送的数据量,以降低网络中设备的压力
三次握手
- TCP标记:存在TCP报文中,占6位,每位各有不同含义
- ACK :确认位,ACK=1。确认号才生效
- SYN:同步位,SYN=1,表示连接请求报文
- FIN:终止位,FIN=1,表示释放连接
seq:序列号
ack:确认号(ack=x+1 表示想要收到x+1的序列号的值)
为什么发送方要发出第三个确认报文(为什么要进行三次握手)?
- 避免已经失效的连接请求报文传送到对方,引起错误
- 如果第一次发送后发送方迟迟得不到回应就会发出第二次请求
- 如果只有两次握手,在重新发的请求确认握手后,后来到的发送请求会再次建立连接,引发错误(如果客户端已经连接超时失败,放弃连接了。这个时候超时的信号又到了服务端,服务第二次握手,认为建立了连接,服务器资源就被浪费了)
- 三次握手中,第二次到达的报文发出第三次请求后,就会忽略后到的请求
四次挥手
- 发送方发出请求断开的报文后,接收方回应受到请求,此时发送方以不能发送报文了,但接收方还可以继续发送报文,待接收方信息发送完成后给发送方发送消息表示消息已经发送完成
等待计时器
等待2MSL的时间
MSL:最长报文段寿命
MSL建议设置为2分钟
- 为什么要等待2MSL?
- 最后一个报文是没有确认的
- 确保发送方的ACK可以到到接收方
- 2MSL时间内没有收到,则接收方会重发,重复第三次挥手的动作
- 确保当前连接的所有报文都已经过期
- 为什么要等待2MSL?
只有在等待计时器结束后才会释放端口
套接字与套接字编程
IP与端口的组合( IP:Port )又称为套接字
套接字(Socket)是抽象概念,表示TCP连接的一端
通过套接字可以进行数据发送或接收
两个套接字既可以确认一条TCP的连接 IP:Port ↔ IP:Port
TCP连接由两个套接字组成 CS架构
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!