计算机网络W11:TCP协议3.5
如何在传输层设计出一个可靠的协议?
IP地址是分配给我们的逻辑地址,MAC是硬件地址,存在IP地址与MAC硬件地址的翻译流程存在.
当出现过早超时时,会有一些延迟ACK即重复收到ACK,此时什么都不做继续等待即可.
窗口大小:最多能忍受的已发送未确认的packet的个数.
GBN的定时器:最早的已发送没有被确认的的分组上设置的timer,所以收到确认以后,我们的定时器会发生变化.
Overview
TCP是双工的,即A可以发给B,B可以发给A.即双工数据流,但受制于物理层的介质的分割.
点对点
无法组播或广播
可靠的,以字节流的方式,因为字节流的方式导致消息没有边界而产生粘包的问题.
pipelined:拥塞控制与流量控制.
流量控制是以一对一对而言的,控制发送速度不要太快,接受者在缓冲区处不要溢出.发送者不要超过接受者的缓冲区的大小.
拥塞控制,路由器缓冲区可能会出现拥塞,故问题在于如何控制发送?[整体而言]
Full duplex data
- 双工
- MSS:最大报文长度,拆分的原因是受制于底层的物理链路.
TCP有一个建立连接的握手的过程.
TCP报文结构.
sequence numbers;
Byte stream “number” of first byte in segment’s data.
ACK number:累计确认,即收到的都是有序的.
ACK:下一个期望的.
FIN:建立连接时的特殊的位要置为1
RST
WIN:window size
42和79是在握手时随机选择的初始值,为了避免某些不必要的冲突.
[假定每一次的分组都只有一个byte]
ACK=43,因为累积确认,表示小于43的都收到了.
A->B的是80,是因为需要注意TCP是全双工和累积确认.
Timeout的值的设置
roundtrip time(一来一回)
TCP:指数加权移动平均,在之前发送时的历史信息数据,对此做菜样.
EstimatedRTT=(1-$\alpha$)*EstimatedRTT+$\alpha$SampleRTT(估算出的RTT)
在估算的基础之外仍需要一个safety margin
- How to set TCP timeout value?
- How to get estimated RTT?
TCP 为什么可靠呢?
- pipeline
- 累计确认
- 重传的定时器
重传的原因:1. Timeout 2. duplicate acks
timeout后需重传,重传后需要重启定时器.
只有一个定时器,指向最早的未被确认的分组.
TCP快速重传
即使在timeout时间还没到,就主动发送了重复的ACK.
TCP flow control
app process->TCP socket ->TCP code ->IP code
流量控制:
Tcp socket receiver buffers的大小是固定的.
流量控制的大小如何控制?
B会把rwnd填到报文头理发送给A. A需要控制已发送未确认的要比这个rwnd
连接管理
连接到底是如何建立的?
三次握手的过程.
client和server的区别在于谁首先发起连接请求,因为TCP 是全双工的.
3次握手的目的?
- A->B让我们说话
- B->A 好的(B接受A发送无问题)
- A->B 你好(A 接受B发送无问题)
具体的3次握手的流程:
TCP报文首部中的SYNbit=1,若置为1,则连接已经建立了.
ACKbit与ACKnum