@gzm1997
2018-03-13T00:16:34.000000Z
字数 4412
阅读 1713
计网笔记
两个主机之前的逻辑连接
两个进程之间的逻辑连接
可靠,按顺序传输
具有:
拥塞控制
流量控制
连接设置
不可靠
不按顺序传输
多路分解demultiplexing,将传输层的报文段数据交付到正确的套接字上工作
多路复用Multiplexing,源主机从不同的套接字中收集数据块,并为每个数据块封装上首部信息从而生成报文段,然后将报文段传递到网络层
示意图:
socket套接字的发送方的复用和接收方的分用都是依靠transport header来实现的
发送方的复用:
处理来自各个套接字的数据,增加transport header,等下被分用的时候用到接收方的分用:
使用transport header来把接收到的segment递给对的socket套接字(因为一个主机上有可能运行着多个套接字)
TCP/UDP segment形式
主机会使用ip地址和端口来引导segment到正确的socket套接字
TCP套接字根据一个4元组来区分:
分用:接收方使用所有这4个值来引导segment到正确的套接字上
服务端主机可以支持多个并发的TCP套接字
web服务器对于不同的连接客户端有不同的套接字
下面这个面向连接的套接字有点迷,有两台来自不同机器的segment发送到同一台机器上的同一个端口上,这时候,他们会被引导到**不同的socket**s上。
但是下面这个例子就很正常了,当时有多个目标ip地址和端口都相同的segment的时候,服务端应该使用线程,把不同的segment引导到不同的线程上处理:
- udp可能会丢包
- 打乱应用层的顺序
- 发送方和接收方之间不用握手
- 没个udp的segment之间是独立的
为什么要用UDP?
- 不用连接那么麻烦
- 简单(还是不用连接)
- header尺寸很小
- 没有阻塞控制
- 处理header field为一个16位的序列
- checksum:短内容的反码
- 发送方把checksum的值放到UDP的checksum位置上
- 计算接收到的segment的校验和
- 检查当计算出来的检验和等于检验和位上的值,等于-没有错误,否则-出错了。
两个16位整数相加
下层的通道非常可靠
- 没有位错误
- 没有包丢失
发送方和接收方的有限状态机是分开的
- 发送方把数据发送到下层的通道
- 接收方从下层通道读数据
- 使用校验和来去除位错误
- 怎样从错误中恢复:
- acknowledgements (ACKs):接收方明确地告诉发送方packet没有问题
- negative acknowledgements (NAKs):接收方明确地告诉发送方packet有问题
- 发送方会把在NAK清单上的从新发一次
rdt2.0新机制:
rdt2.0原理:
当ACK/NAK出错的时候,怎办?
处理重复packet:
无NAK,接收方最后一个包发送NAK,重复NAK导致重发,增加seq_num
有timeout timer
由图可知,传输的时间远远短于等待的时间,链路的使用效率很低,所以就有了流水线协议。
GBN窗口:
GBN工作原理:
显示一次性发送0, 1, 2, 3四个包,0和1接收到了发送ack,但是3丢了,导致后面接着也发送的4,5包即使送到了接收方那里,接收方也是会丢弃的
包0接收到了,交付,但是包1丢了,这时候包2 3 4。。会继续发送,但是接收方接收到之后是缓存,并且发送相应的ack2 3 4,当包1的timeout到了之后,重新发送2 3 ,这时候,包1 2 3 4。。交付
一般a的值为0.125
RTT和样例RTT之间是有误差的:
安全边缘safety margin:
一般而言,B = 0.25
估算timeoutInterval:
tcp发送端事件:
timeout:
ack recvd接收到ack:
tcp快速重传:
如果发送方发现有三个对于同一个还没被ack的segment的acks,重新发送这个unack的segment
因为很有可能这个unacked已经丢失了,所以不等到timeout了。
快速重传算法:
event: ACK received, with ACK field value of y
if (y > SendBase) {
SendBase = y
if (there are currently not-yet-acknowledged segments)
start timer
}
else {
increment count of dup ACKs received for y
if (count of dup ACKs received for y = 3) {
resend segment with sequence number y
}
TCP连接的接受的一边会有一个接受缓冲区receive buffer:
接受方的空余接受缓存区大小:
rwnd这个值放入发给发送方的报文段接收窗口字段中,通知发送方还有多少缓存空间,即:
控制使得:
三方握手示意图:
断开连接:
非正式地说就是太多数据被发送得太快以至于网络无法处理
后果:
- 丢包
- 长等待
阻塞的三种情况:
1. 路由器无限缓存
路由器有限缓存,发送方丢包后会重发
当有过早Timeout的时候
多台有限缓存路由器和多跳路径:
rwnd是接受窗口,cwnd是拥塞窗口
当连接建立,在第一次丢包之前,指数增长发送速率
1. 初始化拥塞窗口为1个MSS
2. 每个RTT之后,让cwnd翻倍
何时结束这种指数增长?
当进入拥塞状态时,cwnd大概是大概是上次拥塞状态的一半,这时,每个RTT只将cwnd增加一个MSS,例如在发送10个报文段,没收到一个ACK就增加1/10个MSS,在接受了10个ACK之后就增加了1个MSS
出现丢包事件时,cwnd设置为1MSS,并且ssthresh设置为cwnd的一半。
慢启动 -> 拥塞避免 -> 快速恢复
一条连接的平均TCP吞吐量: