进程间的通信
运输层向它上面的应用层提供通信服务;通信的实体是两台主机的进程之间在数据交换
网络层为主机之间提供逻辑通信,而运输层为应用进程间提供端到端的逻辑通信
运输层还要对收到的报文进行差错检测(网络层只校验首部而不校验数据报)
运输层向高层用户屏蔽了下面网络核心的细节;TCP可以视为一条全双工可靠信道,UDP可以视为一条不可靠信道
运输层主要协议
TCP传输控制协议、UDP用户数据报协议
应用层语运输层之间的对照关系
运输层的端口
复用:应用层所有应用进程都可以通过运输层再传送刀网络层
分用:运输层从网络层收到数据后发送给各应用
协议端口号(端口),是软件端口(应用层各种协议进程与运输实体进行交互的一种地址);所有采用此协议的进程都有源端口和目标端口两个重要字段
TCP/IP用一个16位的端口号来标志端口(端口号只具备本地意义,不同计算机的相同端口之间没有关联,允许65535个不同的端口号),端口号分为两种
服务端使用的端口号
熟知端口号/系统端口号(0~1023)
登记端口号(1024~49151)
客户端使用的端口号
短暂端口号(49152~65535),在客户京城运行时才会动态选择
用户数据报协议UDP
特点: 1.无连接(减少了开销和发送数据之前的时延)
2.尽最大努力交付(不保证可靠交付,主机不需要维持复杂的连接状态)
3.面向报文的应用层交付的报文并不会拆分、合并,而是保留报文边界(无论多长的报文UDP都会原样发送;报文太长或太短都会降低IP层的效率<分片/首部相对长度太长>)
4.没有拥塞控制(适合允许一定数据丢失却要求不能太大延迟的通讯)
5.支持一对一、一对多、多对多的交互通信
6.首部开销小(仅8字节,TCP有20个字节)
UDP首部格式
1.源端口号:要求对方回信时使用,不需要可以用全0
2.目标端口号:不能为0
3.长度:最小值为8(仅首部)
4.检验和:检测传输是否出错,出错则废弃
UDP的端口分用
如果端口号不正确(不存在进程),则丢弃报文,并由网际控制报文协议ICMP发送“端口不可到达”错误报文
UDP不需要套接字
UDP用户在计算校验和时,要在UDP用户数据报之前体检一个12字节的伪首部。UDP检验和是把首部和数据报一起检验(不同于IP数据报的检验只检验首部)
传输控制协议TCP
TCP的主要的特点:
1.TCP是面向连接的运输层协议
2.每一条TCP连接只能有两个端点,每一条TCP连接只能点对点
3.TCP提供可靠交付的服务
4.TCP提供全双工通信。
5.面向字节流,TCP中的“流”指的是流入到进程或从进程流出的字节序列
TCP的连接
TCP把了连接作为最基本的抽象。TCP连接的端点叫做套接字socket或者插口。
套接字socket = (IP地址:端口号)
每一条TCP连接唯一地被通信两段的两个端点(即两个套接字)所确定。
TCP连接 :: = {socket1,socket2} = { (IP1:port1) , (IP2:port2) }
可靠传输的工作原理
特点: 1.传输信道不产生误差
2.不管发送发的发送速度多快,接收方都来得及处理收到的数据
停止等待协议:一个分组发送完成后停止发送,等待对方确认
在出错的情况下有以下三点
1.发送一个分组后,必须暂存已发送分组的副本,直到接收到确认信号
2.分组和确认分组都必须有编号
3.超时计时器设定的重传时间应比正常往返时间长一点(以规避较大延迟和拥塞)
确认丢失和确认迟到
B因某种原因(数据丢失/网络拥塞没及时确认)收到了两个数据报M和M1,应执行以下动作:
1.丢弃这个重复的M1,不向上层交付
2.向A发送确认
信道利用率
信道利用率公式
流水线传输可以提高信道利用率(连续ARQ协议和滑动窗口协议)
连续ARQ协议
分组发送按照分组序号从小到大发送,位于发送窗口中的5组数据都可连续发送,无需等待确认
接收到第一个分组的确认后,可以将发送窗口向前移动一位,接收方一般采用累积确认的方式(不用逐个发送确认,对按序到达的最后一个分组发送确认即可--全到了)
TCP报文段的首部格式
TCP首部最小长度为20字节
远端口和目的端口:各占2字节
序号:占4字节,此字段的数值为报文段数据的第一个字节的序号(报文段序号)
确认号:占4字节,是期望收到对方下一个报文段的第一个数据字节的序号
数据偏移:占4位,TCP报文段起始距整个报文段的起始处有多远
保留:占6位,目前置0
紧急URG:URG=1时,表明紧急指针字段有效(高优先级),需要配合首部中的紧急指针字段使用
确认ACK:ACK=1时有效,建立连接后的ACK都必须置1
推送PSH:尽快发送,而不会等到缓存填满后统一发送
复位RST:RST=1时,TCP连接出现严重问题,必须释放
同步SYN:在连接建立时用来同步序号;SYN=1&ACK=0时,此连接为请求报文段,建立连接后SYN=1&ACK=1
终止FIN,FIN=1时表明发送已结束,要求释放连接
窗口:占2字节,报文的接收值窗口(以字节为单位)其中明确指出了现在允许对方发送的数据量,窗口值的量在动态变化
检验和:占2字节
紧急指针:占2字节,URG=1时才有效,所有紧急数据处理完之后才会处理正常数据(即使窗口为0也可以发送吉恩几数据)
选项:长度可变,最长可达40字节,当没有选项时,TCP首部长度是20字节
TCP最初之规定了一种选项:最大报文段长度MSS;后续增加了窗口扩大选项、时间戳选项、选择确认
TCP可靠传输的实现
1.以字节为单位的滑动窗口
发送窗口内的数据都会被暂存,等待重发
1.A的发送窗口根据B的接收窗口来确定,但是并不严格等于B的接收窗口。A还可根据网络拥塞情况适当减小自己的发送窗口
2.对不按序到达的数据应该如何处理,TCP并无明确规定,TCP会将不按序到达的数据临时存放在接收窗口中,等到字节流中所缺少的字节收到后,再按序交付上层。
3.TCP要求接收方必须有累积确认功能
超时重传时间的选择
RTT为报文段的往返时间,RTTs为加权平均往返时间
超时重传时间RTO
RTTD是RTT偏差的加权平均值
选择确认SACK
当接收到的字段不全时,可以指明至多4盖字节块的边界信息(8段边界)
TCP的流量控制(发送方别太快了)
利用滑动窗口实现流量控制
接收窗口为0的时候会停止发送
TCP的传输效率
略
TCP的拥塞控制
拥塞控制的一般原理
拥塞控制的实质就是防止过多的数据被注入网络中(拥塞控制是全局性的,不同于流量控制<点对点>)
拥塞控制分为闭环和开环两种
闭环控制基于反馈换路,主要措施如下:
1.检测网络系统以便检测到拥塞何时何处发生
2.把拥塞发生的信息送到可能采取行动的地方
3.调整整个网络系统解决出现的问题
TCP的拥塞控制方法
慢开始 拥塞避免
基于窗口的拥塞控制:发送发维持一个拥塞窗口,发送方让自己的发送窗口等于拥塞窗口
慢开始:试探性的逐步增大发送窗口。在慢开始算法后,每经过一个传输轮次,拥塞窗口cwnd就加倍(传输轮次就是RTT)
拥塞避免:让拥塞窗口缓慢增大,每经过一个往返时间RTT,发送方的拥塞窗口+1(比慢开始的增长速率缓慢得多)
快重传
快恢复
主动队列管理AQM
当队列值超过某个阈值时开始丢弃后面到达的分组(提醒对方发慢点),具体做法如下(随机早起检测RED)
1.若平均队列长度小于最小门限,则把新到达的分组放入队列中进行排队
2.若平均队列长度超过最大门限,则把新到达的分组丢弃
3.若平均队列长度置于两者之间,则随机丢弃新到达的分组
TCP的连接管理
TCP的连接建立(三次握手)
1.B的TCP服务器进程创建TCB(传输控制模块),准备接受客户端的连接请求。然后服务器进入LISTEN(收听状态)
2.A的客户端进程童颜创建TCB,,向B发送请求(SYN=1,同时选择一个初始序号seq=x,不携带数据,但会消耗掉一个序号),TCP客户端进入SYN-SENT(同步已发送)状态
3.B收到请求后,向A发送确认(SYN和ACK均置1,确认号ack=x+1,同时自己选择一个初始序号seq=x,同样不携带数据且消耗一个序号),服务器进入SYN-RCVD状态。
A收到B的确认后,还要向B发送确认(ACK=1,ack=y+1,自己的seq=x+1),A进入ESTABLISHED(已建立连接)
B收到消息后同样进入ESTABLISHED(已建立连接)
TCP连接释放(四次挥手)
1.A向B发送连接释放报文,并停止发送数据,主动关闭TCP连接(FIN=1,seq=u<已传输的数据的最后一个字节序号+1>),A进入FIN-WAIT-1(终止等待1)
2.B收到了连接释放报文后进行确认(确认号ack=u+1,v=最后一个发送的字符序号+1),然后B进入CLOSE-WAIT(关闭等待)
3.A收到B的确认后进入FIN-WAIT-2(终止等待2),等待B发出连接释放报文
4.B发出连接释放报文(FIN=1,且重复已经发送过的确认号ack=u+1),B进入LAST-ACK(最后确认),等待A的确认
5.A收到释放报文后,对此进行确认(ACK=1,ack=w+1,seq=u+1),进入TIME-WAIT(时间等待)<此时连接并未被释放,需要等待2MSL后才能释放,SML为最长报文段寿命>
等待2SML的原因:确保最后一个ACK报文段能送达B,未送到B会重传FIN+ACK
确保本连接持续时间内所有的报文都从网络上消失
B只要收到A发出的确认就会进入CLOSE状态,B的连接比A要早
TCP还有一个保活计时器,确保连接不发生故障
TCP的有限状态机