searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

tcp需要熟练掌握的概念

2023-10-16 11:19:53
4
0

总体概念

  • 三次握手
  • 四次挥手
  • 滑动窗口
  • 超时重传
  • 流量控制
  • 拥塞控制
  • 报文段最大
  • 粘包现象(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出来
0条评论
作者已关闭评论
肥料
1文章数
0粉丝数
肥料
1 文章 | 0 粉丝
肥料
1文章数
0粉丝数
肥料
1 文章 | 0 粉丝
原创

tcp需要熟练掌握的概念

2023-10-16 11:19:53
4
0

总体概念

  • 三次握手
  • 四次挥手
  • 滑动窗口
  • 超时重传
  • 流量控制
  • 拥塞控制
  • 报文段最大
  • 粘包现象(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出来
文章来自个人专栏
网络学习专栏
1 文章 | 1 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0