为什么udp有包长,而tcp没有包长。

首先,send()发送一次发送1k,发送一次缓冲区满了就会返回-1。2k发送出去后缓冲区被清空,send()才会被再次调用。最大传输片会打印四个包发送。而最大传输单元是在数据链路层对网卡的一些限制,如果mss大于mtu时候就会被分割,而mss小于mtu时候就会直接发送。所以udp需要包长,而tcp不需要因为mss+tcp包头就可以完成不需要包长。具体点说,就是帧需要,加上512,可以将包长进行计算出,这里不做重复的事减轻了很多后续工作。

  • 发送1m的文件

  • sendbuf 2k

  • mss(最大传输片)=512,mss是在包头的option中设置的。

  • mtu(最大传输单元)=1500

协议头分析

  • ACK表示确认

  • PSH表示应用程序发来数据赶紧处理呀宝贝

  • RST表示告诉对端你的数据不合法,重置

  • SYN表示同步头

  • FIN表示古德拜啦~断开前兆

慢启动的问题

​对数增长慢启动后,线性增拥塞控制,最后是要快速重传。

进入弱网环境,rtt(数据包往返)出现很长时间,这就叫抖动。

rtt=0.1rtt(new)+0.9rtt(old)这是一个消抖的过程,通信专业知识,有时间应该去学学一下研究通信啦!得出的值就可以判断是否超时。当然了,拥塞避免增长速度肯定是没有慢启动指数增长的快,但是面积大,面积就是传输的数量,所以拥塞避免是为了保证传输的量更加大。

如果接收端缓冲区buffer满了,但是没有丢失数据,还会发吗?会

就不会发了呀宝贝。回应上写的windows为0。服务端的recvbuf和回应客户端返回的window完全是两个不同的概念,但是两个值会一直接近。

如果服务器端recvbuf从无到有,如何告诉客户端我有空间了呢?

服务器主动告诉客户端,我的recvbuf不为0

客户端轮询

第一种服务器主动告诉客户端,优点是实时性比较好,但是缺点是发生丢包怎么办?将会陷入死锁的状态。如果做一个定时器会不会好一点?可是客户端关机了怎么办?

**TCP的做法是什么呢?

当服务器recvbuf为0的时候,客户端主动轮训发送探测包,服务器的有空间吗?服务器被动的回。

**

如果服务器主动发送回复客户端,客户端不回服务器多次发送可以不?做法是可行的,但是违背了原则,毕竟服务器也不愿意当舔狗,主动向全世界客户端宣布爱你。

滑动窗口的运行机制

两个指针表示收尾,第三根指针作为成功接收否的标记指针,尾指针后面的接收的指针不处理。

​TCPkeepalive和应用层keepalive,应用层的keepalive可控性更强,而TCPkeepalive很笨,有点像小刘同学嘎嘎幸亏她不知道要不然肯定会打我,应用层你感知不到好难受。

C++后台开发系统学习地址:C/C++Linux服务器开发高级架构师/C++后台开发架构师​

以下学习资料,C++后台开发面试题,教学视频,C++后台开发学习路线图,免费分享有需要的可以自行添加:学习资料群720209036 进去自取

问答环节

Q1:tcp利用send函数发送数据发现数据丢失了,需要在应用层对丢包重传处理吗?

答:利用tcp传输数据,发送数据是一定会发送到对端网卡。如果你发生丢包,那要注意send()返回值是为-1,应用层处理业务逻辑有问题。往往错误都是一些低端的错误。

Q2:滑动窗口的尾指针后面组织准备接受数据的状态,这是哪里在组织,操作系统吗?

答:是tcp协议组织的。

Q3:如图,当客户端有多个数据包同时发送给服务器,发送中途状态服务器的recvbuf满了,服务器需要立刻通知客户端吗?还是要等一个阶段的数据发送的差不多了再告诉客户端有一部分数据未接收成功?目前看来,这个状况是服务器性能问题,所以不会进入快速重传状态对吧?

答:要发送多少,是接收端返回数据。接收端接收数据数据以后,会回ack,ack里面就会确定,还能接受大小。

参考资料

Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习

后端开发【一大波有用知识】tcp/ip定时器与滑动窗口详解相关推荐

  1. 后端开发【一大波有用知识】数据库之mysql索引原理详解

    1.索引 索引分类:主键索引.唯一索引.普通索引.组合索引.以及全文索引(elasticsearch): 1.1.主键索引 非空唯一索引,一个表只有一个主键索引:在innodb中,主键索引的B+树包含 ...

  2. TCP/IP 协议栈及 OSI 参考模型详解

    TCP/IP 协议栈及 OSI 参考模型详解 转载地址:http://www.codeceo.com/article/tcp-ip-osi-model.html OSI参考模型 OSI RM:开放系统 ...

  3. TCP/IP 协议栈及 OSI 参考模型详解--云平台技术栈04

    导读:之前发布了云平台技术栈(ps:点击可查看),本文主要说一下其中的tcp/ip和网络! 来源:王东裕 http://wangdy.blog.51cto.com/3845563/1588379 OS ...

  4. 后端开发【一大波有用知识】Redis中的IO多线程(线程池)

    一.Redis中的IO多线程原理 ​服务端收到一条信息,给它deconde成一条命令 然后根据命令获得一个结果(reply) 然后将结果encode后,发送回去 redis的单线程是指,命令执行(lo ...

  5. 后端开发【一大波有用知识】MySQL索引原理(索引、约束、索引实现、索引失效、索引原则)以及SQL优化

    一.索引 索引分类:主键索引.唯一索引.普通索引.组合索引.以及全文索引(elasticsearch) 主键索引 非空唯一索引,一个表只有一个主键索引:在 innodb 中,主键索引的 B+ 树包含表 ...

  6. 后端开发【一大波有用知识】Redis的线程模型和异步机制

    文章目录 Redis 6.0引入多线程 异步机制 Redis pipeline技术 Redis 事务 ACID特性分析 redis 发布订阅 我们通常说,Redis 是单线程,主要是指 Redis 的 ...

  7. 后端开发【一大波有用知识】—Redis,Memcached,Nginx网络组件

    reator网络编程 epoll被称为事件管理器,利用管理器去管理多个连接. int clientfd=accept(listenfd,addr,sz); clientfd ==-1 &&am ...

  8. 后端开发【一大波有用知识】定时器方案红黑树,时间轮,最小堆

    目录: 一.如何组织定时任务? 定时器收网络IO处理造成误差特别大,该怎么处理? 用何种数据机构存储定时器? 红黑树如何解决相同时间的key值的? 最小堆 时间轮 一个帮助理解单层级时间轮的例子 如何 ...

  9. TCP/IP协议和协议分层详解

    通常使用的网络是在TCP/IP协议族的基础上运作的,而HTTP属于它内部的一个子集. TCP/IP协议族 计算机与网络设备要相互通信,双方就必须基于相同的方法.比如,如何探测到通信目标.由哪一边先发起 ...

最新文章

  1. oracle的for和i++
  2. 践行科技向善,腾讯Light 把光引向厦门
  3. vsftpd安装配置
  4. 如何创建vss2005的数据库
  5. 寒冷的高纬度——我的梦开始的地方
  6. 数据库原理----学习目标
  7. IP/TCP/UDP/RTP/RTCP 包结构图
  8. ubuntu麒麟下安装并启用搜狗输入法
  9. 当云原生遇到混合云:如何实现“求变”与“求稳”的平衡
  10. 【Python】Matplotlib使用Cursor实现UI定位
  11. 职场必须要会的餐桌礼仪
  12. 在Linux下编写C++程序,使用gcc编译c++出错
  13. 数组删除一行_一行Python代码能做出哪些神器的事情
  14. python数据结构与算法分析 第2版_题库 | 百度数据结构 / 算法面试题型介绍及解析 第 2 期...
  15. 2021-09-03相同的树
  16. 冬季黄山旅游费用明细
  17. 基于FPGA的电子计算器设计(下)
  18. java项目生成多个条码_java – 生成随机条形码 – 一个设计问题
  19. Android通用流行框架大全,零基础入门学习android
  20. 《用C#制作PDF文件全攻略》

热门文章

  1. docker学习笔记(四):docker网络模式及桥接配置
  2. python requests下载网页_Python requests 获取网页一般的方法
  3. Latex 图标题过长不能跨页显示解决办法,Figure caption does not continue on new page
  4. 2022年西北工业大学计组试点班龙芯杯个人赛参赛作品
  5. 惠普服务器性能怎么样查,惠普服务器怎么样
  6. 线性回归_线性回归方程
  7. 11.2 22大数据c语言自测3题解
  8. c语言新建一个单向链表菜鸟,【图片】菜鸟的进击——玩转C语言链表【c程序设计吧】_百度贴吧...
  9. filezilla定时上传_filezilla使用教程,filezilla使用教程,教程详解
  10. electron-builder打包方式