传输层笔记
概念
什么是可靠?
不错、不丢、不乱
可靠数据传输协议
可靠数据传输对应用层、传输层、链路层都很重要
网络Top-10 问题
信道的不可靠特性决定了可靠数传输协议(rdt) 的复杂性
rdt_send:应用层将数据交付给可靠传输协议(rdt)以发送 给对方
udt_send:被rdt调用,在不可靠的信道上向接收方传输数据
rdt_rcv:当数据包到达接收方信道时被调用
deliver_data:向上层应用交付数据
rdt_send和deliver_data 是单向的,应用层发送和接收到的都是正确的
udt_send和rdt_rcv 是双向的,说明在不可靠的信道通道进行数据传输,需要双向的控制消息流动
可靠数据传输协议
rdt1.0:可靠信道上的可靠数据传输
条件:底层信道完全可靠
- 不会发送错误
- 信道不会弄丢分组
rdt2.0:产生位错误的信道
底层信道可能翻转分组中的位(bit)
- 利用校验和检测位错误
如何从错误中恢复
- 确认机制(Acknowlegements,ACK):接收方显示的告诉发送方分组已经正确接收。
- NAK:接收方显示的告诉发送方分组错误
- 发送方收到NAK后,重传分组
基于这种重传机制的rdt协议称为**ARQ(Automatic Repeat reQuest)**协议
Rdt2.0比Rdt1.0中新引入的新机制
- 差错检测
- 接收方反馈控制信息:ACK/NAK
- 重传
停-等协议
rdt2.1:产生位错误的信道
如果ACK/NAK 消息发生错误/被破坏(corrupted)会怎么样
- 如果ACK/NAK 坏调,发送发重传
- 不能会简单的重传:产生重复分组
如何解决重复分组问题
- 序列号(sequence number):发送方给每个分组增加序列号
- 接收方丢弃重复分组
发送方:
注意:第一条数seq=0,当收到接收方返回该数据已经收到且无损害时,seq=1,表示第二条数据,两个序列号够用,因为使用了停等协议。
rdt2.2:无NAK消息协议
rdt3.0
假设信道既可能发生错误,也可能丢失分组,怎么办?
- “校验和+ 序列号+ACK+重传” 不够用了,如果第一次发送丢失,发送方和接收方都不知道怎么处理。
方法:发送方等待“合理”时间
-
如果没有收 到ACK,重传
-
如果分组或ACK只是延迟而不是丢了
实例(1)
a:发送方发送pkt0,接收方就收到正确的包回复ACK0,发送方收到ACK0(表示发送方知道接收方已经收到了pkt0了),然后发送方发送ACK1给接收方重复上面的步骤
b:发送方发送pkt0,接收方就收到正确的包回复ACK0,发送方收到ACK0(表示发送方知道接收方已经收到了pkt0了),然后发送方发送ACK1给接收方,但是此时pkt1已经丢失了,接收方不会不知道也不会回ACK/NAK,只能当定时器超时了再次发送才能继续交互。
接收方回复ACK是最后一次成功接收的
Rdt3.0 性能分析
Rdt3.0 虽然能够正常工作,但性能很差
实例:1Gbp链路,15ms端到端传播延迟,1kb分组
- 发送方利用率:发送方发送时间百分比
- 在1Gbps链路上每30毫秒才发送一个分组 33kb/sec
- 网络协议限制了物理资源的利用
流水线和滑动窗口协议
概念:
- 窗口滑动协议:sliding-window protocol
- 窗口
- 运行使用的序列号范围
- 窗口尺寸为N:最多有N个等待确认的消息
- 滑动窗口
- 随着协议的运行,窗口在序列号空间内向前移动,上面的send_base+1,表示窗口向右移动了一个分组
- 滑动窗口协议GBN和SR
在TCP/IP层中利用滑动窗口
1、使用的序列号0 ~ 2^32(0 ~ 4 294 967 295)
2、TCP/IP滑动窗口大小计算方式:大序列号-小序列号
3、TCP/IP滑动窗口的取决于 = min(拥塞窗口大小,接收端接收窗口)
面向连接传输协议(Tcp)
TCP报文段的首部格式
1、源端口和 目的端口 各占2个字节,分别写入源端口号和目的端口号。
2、序号 占4个字节,序号范围是[0,2^32 - 1] , 序号增加到 2 ^32 -1 后,下一个序号又回到了0,TCP是面向字节流的,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号,整个要传送的字节流的起始的序号,例如,一个报文的序号值是301,而携带的数据共有100个字节,这表明本报文段数据的第一个字节的序号是301,最后一个字节的序号是400,显然,下一个报文的(如果还有的话)的数据序号应当从401开始,即下一个报文的序号字段值为401,这个字段的名称也叫做报文段序号
3、确认号 占4个字节,是期望收到对方下一个报文段的第一个数据字节的序号,例如:B收到A发送过来的一段报文段,其字节序号值为501,而数据长度是200字节(501~700),这表明B正确收到A发送的到序号700为止的数据,因此,B期望收到A下一个数据第一个序号是701,于是B在发送给A的确认报文段中把确认好置为701,请注意,现在的确认号不是501,也不是700,而是701.
- URG:紧急指针是否有效,置为 1 时表示有效,报文应当被优先处理。
- ACK:确认号是否有效,置为 1 时表示有效,TCP 规定,在连接建立后所有传达的报文段都必须把 ACK 置 1。
- PSH:push标志,置为 1 时表示带有push标志的数据,指示接收方在接收到该报文段后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。
- RST:重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。我们把携带RST标识的称为复位报文段。
- SYN:仅在三次握手建立 TCP 连接时有效。在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1。我们把携带SYN标识的称为同步报文段。
- FIN:用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。我们把携带FIN标识的称为结束报文段。
如果确认好=N,则表明:到序号N-1为止的所有数据都已经正确接收。
由于序号字段有32位长,可对4GB(4千赵字节)的数据进行编号,在一般情况下,可保证序号重复使用时,旧序号的数据早已通过网络到达终点了。
TCP的重传实例
TCP用的是累计确认机制
TCP连接管理
-
TCP sender 和reciver在传数据前需要建立连接
-
初始化TCP变量
seq.#
Buffer和流量控制信息 -
Client:连接发起者
Socket client = new Socket(“hostname”,port) -
Server:等待客户连接请求
Socker server = welcomSocket.accpt();
三次握手
step1:客户端发送一个连接请求,SYN=1,并随机生成一个序列号client_isn
step2:服务器端回复答应建立连接SYN=1,并且也随机生成一个序列号位server_isn,而且回复step1发送的正确收到和期望下次收到的是序号client_isn +1,所以这一步的ack=client_isn +1,报文段的头部ACK回复成功收到连接请求,ACK=1
step3:客户端收到服务器端的答应连接的回应,所以发送SYN=0,ACK=1,同时发送报文的第一个序号为:client_isn +1,且回复成功收到和期望下一个收到的报文是server_isn + 1
注意:在报文发送的时候
seq:表示发送的这段报文所要发数据的第一个字节的序号
ack:表示成功收到,且期望收到下一个报文的第一个数据字节的序号,序号都是0~2^32 -1 循环使用的。
四次挥手
step1:client 向server发送TCP FIN 控制的segment
step2:server 收到FIN,回复ACK,关闭连接,发送FIN
step3:client收到FIN,回复ACK,进入’'等待",如果一会儿收到FIN,会重新发送ACK
step4:server收到ACK,连接关闭。