一、答案

对字节流分段并进行编号然后通过 ACK 回复和超时重发这两个机制来保证。

二、分析

TCP 协议是架设在 IP 协议之上的传输层协议,尽管 TCP 是以字节流的方式进行传输,但是其内部还是依靠 IP 层的数据包的形式进行通信。

很惨,为了适应 IP 层以数据包的方式进行沟通的方式,TCP 层不得不将字节流拆分成若干个小的数据包(segment),在每个 segment 头部挂上 TCP 协议头,上面写明该 segment 的第一个字节在整个字节流的位置,即:seq 。同时写明该 segment 的字节数量,即:Data offset = len。

通过上述记录的信息,接收端会推断出下一个 segment 在整个字节流的位置(seq + len)。当下一个包到来时,接收端判断该包的 seq 是否符合要求,若符合则回复 ACK,若不符合则接收端可以直接丢弃该包(若直接丢弃,则说明滑动窗口大小为1)。

发送端若接收到 ACK,则说明之前发送的包的顺序都是没有问题的,则发送下一个包。若一段时间之内没有接收到 ACK,则有如下可能:

  1. 上一个包接收端没有收到,从而重发该包。
  2. 接收端收到了上一个包,但是回复的 ACK 丢失,那么发送端依然会重发上一个包。接收端收到该包之后就明白上一个ACK 发送失败,则接收端会再次发送 ACK 包。

经过上述一系列操作,TCP / IP 可以保证数据可以有序并且可靠的发送至接收端。但是有个问题,因为发送端每发送一个包,接收端就要回复 ACK,这就导致了网络吞吐量太低!对于该问题,后序文章会讲解解决方案。

(SAW:Game Over!)

TCP/IP / 如何保证数据包传输的有序可靠?相关推荐

  1. TCP\IP 数据流与数据包

    因为这段时间再看suricata的源码,然后发现自己对数据流与数据包的概念有点模糊,然后到网上去百度,发现网上的解释少得可怜,大多数都是一些名词解释,没什么收获,后来看多了也了解了一些,所以记录下来, ...

  2. TCP/IP数据包 - 传输控制层到链路层

    注:本文转自  https://blog.csdn.net/luguifang2011/article/details/40658723 一.OSI七层模型 OSI中的层 功能 TCP/IP协议族 应 ...

  3. TCP是如何保证数据的可靠传输的

    TCP是如何保证数据的可靠传输: 1.TCP在传输有效数据之前要求通信双方必须先握手,建立通信才可以进行数据传输! 2.TCP的接收在接收到数据包之后会发送ack(可以理解为"回复消息&qu ...

  4. ip fragmentation_为什么 TCP/IP 协议会拆分数据

    来自公众号:真没什么逻辑 链接:https://draveness.me/whys-the-design-tcp-segment-ip-packet/ 为什么这么设计(Why's THE Design ...

  5. 计算机网络 数据段、报文、IP数据报、数据包、MAC帧的区别;应用层、运输层、网络层、数据链路层、物理层的区别与功能;转发器、集线器、网桥、交换机、路由器、网关的功能与区别

    主要解决三个问题: 1.数据段.报文.IP数据报.数据包.MAC帧的区别 2.应用层.运输层.网络层.数据链路层.物理层的区别与功能 3.转发器.集线器.网桥.交换机.路由器.网关的功能与区别 数据传 ...

  6. IP数据包传输的完整过程

    主机A与主机B通信,A Ping B,图1:A-交换机-B,AB同一子网 (1)ping数据包用的是ICMP协议,IP协议的一个子协议,位于三层,包含A的IP,B的IP,三层进行IP封装成包,进入二层 ...

  7. TCP/IP协议和工业以太网传输控制方法 及通信模式比较1

    TCP/IP协议 Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本 ...

  8. 《图解TCP/IP》笔记(十四)传输层两大协议TCP和UDP

    前言:这是我<图解TCP/IP>笔记系列最后一篇(咕咕咕了将近两个月hh),TCP UDP其实面试的时候经常问到! 目录 传输层的定义: TCP与UDP对比 端口号 通信识别: 确定端口号 ...

  9. 基于TCP流协议的数据包通讯

    Fanxiushu   2016-02-04,引用或转载请注明原始作者. TCP通讯是流协议,它不像UDP那样基于包为边界的通讯方式, TCP流式协议,举个简单例子,一端用send 分别发送 100, ...

最新文章

  1. html5知识点补充—hgroup元素的使用
  2. 使用sqlite3解决IDEA中SVN更新提示cleanup却无法cleanup的问题
  3. 动手写 framebuffer 画点、划线程序 (七)
  4. 剑指offer:给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,..,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]
  5. DotNetCore跨平台~Dockerfile的解释
  6. 会议升降计算机主机,升降式无纸化多媒体会议系统
  7. 在Windows 7中安装、配置和使用IIS7和ASP
  8. OpenCV探索之路(九):模板匹配
  9. C语言 饭卡管理系统
  10. python汉字拼音首字母,python获取一组汉字拼音首字母的方法
  11. proteus中power怎么设置电压_Proteus 电源设置
  12. 【WIN问题】微软Microsoft onenote/store 无法连接网络无法同步解决
  13. win7计算机打开显卡设置在哪里,win7在哪里打开显卡设置
  14. 竖排文字的3种设计方法
  15. 华为云学院新春大礼包:场景化微认证上新了!
  16. FCC算法:十三、过滤数组假值--Falsy Bouncer
  17. Spoon软件运行时点击右键程序无响应的解决方法
  18. pytorch 目标检测数据增强 详细讲解
  19. 职业学校的老师教计算机,职业院校计算机教学方式方法分析
  20. hao123.com上的邮箱登录

热门文章

  1. C#编程总结(七)数据加密——附源码
  2. PLSQL设置显示的字符集及PLSQL的一些自身设置
  3. ASP.NET服务器控件数据绑定总结
  4. 【机器学习课程01】李宏毅2020年机器学习课程开课啦!!!
  5. MASK -RCNN
  6. 升级python3后yum出现异常解决办法
  7. maven版本控制实战
  8. Linux 管道使用示例
  9. 打印JVM配置参数的命令
  10. ThreadPoolExecutor的七个参数详解