社区专栏>tcp需要熟练掌握的概念>
总体概念
- 三次握手
- 四次挥手
- 滑动窗口
- 超时重传
- 流量控制
- 拥塞控制
- 报文段最大
- 粘包现象(UDP没有,因为面向消息传送,不需要等待到一定程度才能发包,Nagle算法)
- RTT 往返延时
三次握手
- client: syn,client初始化序列号
- serverack(序列号+1),syn(server初始化序列号)
- client: ack(序列号+1)
传输
- client: ack(序列号+1),传输数据(PSH),client初始化序列号+1
- server: ack(client初始化序列号+1+字节数),传输数据(PSH),server初始化序列号+1
四次挥手
粘包
- Nagle算法:会等待有ack返回才会进行发送,也就是所有数据要发送之前,都会缓存。知道接收一个ack的包。
- 解决方式: 发送方关闭nagle算法,或者约定好数据协议,比如设置分隔符,接着加上多少个字节表示这个分组的大小。
socket
- 理解为一个文件标识符fb建立和内核数据结构的联系,只需要把这个fb的标识符,就可以索引到底层的socket的数据结构,socket的数据结构有普通的,同一个进程之间的通信,也有网络连接的通信。有个指针,保存了缓存的数据,包括了要发送的数据和接收的数据。
- socket(),bind(),listen(),accept(),recv(),close()
- socket(),connect(),send(),close()
重传机制
- 超时重传
- 快重传
- sack重传(选择性重传),需要双方都开启表示,tcp有个字段是sack,可以指明接收方已经接收哪部分的数据
- Duplicate SACK
滑动窗口
- 累计应答
- 滑动窗口左移的字节和返回的ack有关
- 流量控制里面使用的窗口,认为本次的缓存,还剩下多个窗口可以使用,一个窗口一个字节
- 发送方,三个指针,SND.WND、SND.UN、SND.NXT
- SND.WND:表示发送窗口的大小(大小是由接收方指定的)
- SND.UNA:是一个绝对指针,它指向的是已发送但未收到确认的第一个字节的序列号
- SND.NXT:也是一个绝对指针,它指向未发送但可发送范围的第一个字节的序列号
- RCV.WND:表示接收窗口的大小,它会通告给发送方
- RCV.NXT:是一个指针,它指向期望从发送方发送来的下一个数据字节的序列号
总结
- mss最大的1460-12(时间戳)= 1448
- 发送是tcp报文发送。也是发送的单位
- 滑动窗口是构建报文之前的窗口,基本由接收方确认。这里的窗口的单位是字节
- 首先选择滑动窗口的数据,封装成tcp报文段,放到缓存中,使用nagle算法,确认之后发送。tcp报文段有个16字节的窗口(65535个字节)
- ack使用的是seq+字节数作为返回确认。sack返回已经接收到断层的字节数,返回重复接收的字节端
- tcp报文段可不一定是mss出来
肥料
肥料
总体概念
- 三次握手
- 四次挥手
- 滑动窗口
- 超时重传
- 流量控制
- 拥塞控制
- 报文段最大
- 粘包现象(UDP没有,因为面向消息传送,不需要等待到一定程度才能发包,Nagle算法)
- RTT 往返延时
三次握手
- client: syn,client初始化序列号
- serverack(序列号+1),syn(server初始化序列号)
- client: ack(序列号+1)
传输
- client: ack(序列号+1),传输数据(PSH),client初始化序列号+1
- server: ack(client初始化序列号+1+字节数),传输数据(PSH),server初始化序列号+1
四次挥手
粘包
- Nagle算法:会等待有ack返回才会进行发送,也就是所有数据要发送之前,都会缓存。知道接收一个ack的包。
- 解决方式: 发送方关闭nagle算法,或者约定好数据协议,比如设置分隔符,接着加上多少个字节表示这个分组的大小。
socket
- 理解为一个文件标识符fb建立和内核数据结构的联系,只需要把这个fb的标识符,就可以索引到底层的socket的数据结构,socket的数据结构有普通的,同一个进程之间的通信,也有网络连接的通信。有个指针,保存了缓存的数据,包括了要发送的数据和接收的数据。
- socket(),bind(),listen(),accept(),recv(),close()
- socket(),connect(),send(),close()
重传机制
- 超时重传
- 快重传
- sack重传(选择性重传),需要双方都开启表示,tcp有个字段是sack,可以指明接收方已经接收哪部分的数据
- Duplicate SACK
滑动窗口
- 累计应答
- 滑动窗口左移的字节和返回的ack有关
- 流量控制里面使用的窗口,认为本次的缓存,还剩下多个窗口可以使用,一个窗口一个字节
- 发送方,三个指针,SND.WND、SND.UN、SND.NXT
- SND.WND:表示发送窗口的大小(大小是由接收方指定的)
- SND.UNA:是一个绝对指针,它指向的是已发送但未收到确认的第一个字节的序列号
- SND.NXT:也是一个绝对指针,它指向未发送但可发送范围的第一个字节的序列号
- RCV.WND:表示接收窗口的大小,它会通告给发送方
- RCV.NXT:是一个指针,它指向期望从发送方发送来的下一个数据字节的序列号
总结
- mss最大的1460-12(时间戳)= 1448
- 发送是tcp报文发送。也是发送的单位
- 滑动窗口是构建报文之前的窗口,基本由接收方确认。这里的窗口的单位是字节
- 首先选择滑动窗口的数据,封装成tcp报文段,放到缓存中,使用nagle算法,确认之后发送。tcp报文段有个16字节的窗口(65535个字节)
- ack使用的是seq+字节数作为返回确认。sack返回已经接收到断层的字节数,返回重复接收的字节端
- tcp报文段可不一定是mss出来