传输层提供的服务
端口号的作用
通过“端口号”标识本主机的一个特定进程(注意:每台主机的端口号是相互独立的;TCP、UDP两种协议的端口号也是相互独立的)
TCP或UDP协议,通过Socket套接字 = {IP地址:端口号},唯一标识网络中的一台主机上的一个应用程序
端口号的分类
服务器使用的端口号:0~1023(通常只能用于被熟知的重要应用程序);1024~49151(登记端口号)
客户端使用的端口号:49152~65535(短暂端口号)
传输层的功能
实现端到端(进程到进程)的通信
复用和分用
复用(从上到下):在发送数据的时候,同一台主机上的多个进程可以将使用同一个传输层协议
分用(从下到上):在接收数据的时候,传输层可以正确交付到目的进程
差错检测
TCP检测出差错后丢弃数据,并通知发送方重传
UDP检测出错误后直接丢弃数据,且不通知发送方
向应用层提供两种服务
面向连接的、可靠的端到端传输服务(TCP)——确保数据正确、完整,但开销大、实时性较差
无连接的、不可靠的端到端传输服务(UDP)——数据可能出错、丢失,但速度快、开销小
UDP
UDP协议
UDP协议的特点
UDP首部很小,只占8B
UDP每次传输一个完整的报文,不支持报文自动拆分、重装
UDP是无连接的、不可靠的(可靠性可以交给应用层处理),也不支持拥塞控制
UDP支持一对一(封装成单播IP数据报)、一对多(封装成广播/多播IP数据报)
UDP数据报格式

UDP检验
差错检测算法
检验和的计算:将原始数据以16bit为一组,进行二进制加法(最高位产生进位需要回卷),加法运算的最终结果逐位取反,得到16bit“检验和”
差错检验方法:接收方将收到的内容以16bit为一组,进行二进制加法(最高位产生进位需要回卷)
如果加法结果为全1,说明没有差错,否则证明有差错
要点
发送方在计算检验和之前,需要添加伪首部,计算完校验和之后,拆除伪首部
接收方在差错检验之前,需要添加伪首部,检验完之后,拆除伪首部(如果检验出差错,就对其该UDP数据报,如果没有差错,就接受该UDP数据报)
TCP
TCP协议
TCP协议的特点
TCP首部更大,占20~60B
TCP支持报文自动拆分、重装,因此可以传输长报文
TCP是有连接的、可靠的、支持拥塞控制
TCP仅支持一对一传输
TCP协议的三大阶段
建立连接(三次握手)
数据传输
释放连接(四次挥手)
TCP段的格式

URG:为1时,紧急指针有效,表示这是紧急数据,应尽快插队发送
ACK:为1时,表示ack字段是否有效;只有握手1的ACK = 0,其他的都ACK = 1
PSH:为1时,表示希望接收方尽快回复(用于交互式通信)
RST:为1时,表示出现严重差错(如主机崩溃),必须释放连接;也可用于拒绝一个非法报文段(如恶意的黑客攻击)
SYN:表示当前的TCP报文段是否是在请求连接或同意请求连接;只有握手1、握手2的SYN = 1,其他的都SYN = 0
FIN:表示其中一个进程向另一个进程挥手告别;只有挥手1、挥手3的FIN = 1,其他的都FIN = 0
建立TCP连接时,在握手1、握手2的选项中协商MSS(最大段长)
MSS的值表示在接下来的数据传输中,一个TCP报文段最多携带多少数据(首部不算在内)
TCP连接管理
建立连接
建立连接过程中SYN、ACK、FIN、seq、ack_seq的值

握手3是否携带数据对ack_seq的影响

进程的TCP状态转换

释放连接
释放连接过程中SYN、ACK、FIN、seq、ack_seq的值

进程的TCP状态转换

MSL:最长报文段寿命,是由TCP协议规定的一个固定时间长度
TCP可靠传输
序号:进程在建立连接时确定起始序号,数据传输过程中,每个字节对应一个序号
确认机制
累计确认规则:若果而收到ack_seq = n,说明序号在n之前的所有字节都已正确接收
返回ACK的时机:推迟时间最多不能超过0.5秒(推迟确认)
如果自己也有数据要传送给对方,立即返回ACK段,并“捎带”自己的数据
若连续收到两个长度为MSS的报文段,就应该立即返回ACK段
两种ACK段
专门确认:一个ACK段只有TCP首部,没有携带数据
捎带确认:一个ACK段顺道携带了数据
重传机制
超时重传:每发出一个报文段,就设置一个计时器,若计时器到期还没收到确认,就重传这个报文段,并重置计时器
快重传
作用:让可能出错的报文段尽早重传,而不是非要等到超时在重传
配套机制:立即确认(每收到一个TCP报文段,就立即返回一个ACK段;及时收到一个失序报文段,也要立即返回ACK段)
当发送方连续收到三个确认号相同的冗余ACK(1 + 3 个ACK)时,就立即重传该确认号对应的报文段
TCP流量控制
接收方维持一个接收窗口,接收窗口不能大于接收缓冲区的大小;接收窗口“框住”的是接收方还允许接收的序号范围
发送方维持一个发送窗口,发送窗口不能大于发送缓冲区的大小;发送窗口不能大于接收窗口的大小;发送窗口“框住”的是发送缓冲区中,已发送但尚未收到确认的数据,以及可以发送但尚未发送的数据
TCP拥塞控制
拥塞控制
如何判断网络拥塞
发出的每个报文段,都能顺利地收到ACK确认——不拥塞
收到冗余ACK,引发快重传——有点拥塞
发出的报文段未能按时收到ACK,引发超时重传——严重拥塞
如何解决拥塞
迅速减少发送的数据量
严重拥塞就迅速缩小拥塞窗口
有点拥塞就适当缩小拥塞窗口
慢开始算法
cwnd值从1开始,每收到一个ACK,就让cwnd + 1(当cwnd < ssthress时适用)
拥塞避免算法
在一个RTT内,即使收到多个ACK,也只能让cwnd + 1(当cwnd >= ssthress时适用)

快恢复算法
一旦发生快重传,就将阈值、cwnd都设置为当前cwnd的一半,然后切换到“拥塞避免算法”

注:ssthresh不能小于2