抓包整理————tcp 传输数据的基础概念[十一]
前言
简单介绍一下tcp 数据传输。
正文
tcp 数据传输是怎么样子的呢?
比如我们在代码中写好了,connection 去连接。
然后我们用 write 去读取数据,这个时候呢,到底我们的操作系统做了什么呢?
这个时候操作系统肯定就将我们的data,打包成了tcp包然后发送出去了呀。
但是有一个问题啊,比如我们传输几M数据的话,那么肯定不能一次性传出去的呀,要弄成一个一个包出去。
这就是segment,也就是要分段啊。 那么怎么分段呢?

讲述一下传输过程,首先呢,应用层的数据,传输给tcp层(可以理解为程序),然后tcp 层弄完了就给ip层打包发送到数据链路层。
接收方,也是从数据链路层,到ip层,然后解析到tcp 层,然后给应用层。
那么当在tcp 层进行处理的时候其实就应该分段,因为ip层的分段传输效率很低。
如果tcp层就做好了分段,那么传输到ip层做处理的时候就不会进行分段了。
那么分段的依据为:
- MSS(max segment size): 防止ip层分段
- 流控: 接收端的能力
这个流控是什么呢? 就是简单的讲是这样的,比如说,你不停的发,但是接收端接收不了(缓存不足),那么这样会导致丢包,从而造成效率低下,后面滑动窗口会提及到这个。
这里介绍一下什么是mms:
定义:仅指tcp 承载数据,不包含tcp头部的大小。
mss 选择目的:
尽量每个segment 报文携带更多的数据,以减少头部空间占用比例
防止segment 被某个设备的ip层基于mtu拆分。
默认mss:536字节(默认mtu576字节,20字节ip头部,20字节tcp头部)
MSS 分类:
发送方个最大报文段:SMSS
接收方最大报文段: RMSS

上面可以看到他们在连接的时候就确定了mss大小。
那么tcp 发送我们知道是流,流就意味着顺序的,a发一个,然后b收到一个,然后b发送确认后,那么a再发送。
这样效率似乎是有点低的。
那能不能改进呢?比如a发出去5个,如果收到一个确认了,然后就继续发送出去。如果一段时间之后没有收到确认,就把没收到确认的发送出去。
这样听起来似乎不错,是一个很好的理论。
但是这样就有一个问题啊,那就是又不是每一个包的大小是一样的,比如前面5个包是1m。后面可能后面的10个包才1m,这个时候并发就应该是10了。
这个就是后面滑动窗口的问题。因为确认的是字节流,那么就需要有一个东西要确认这个收到的位置,这个就是序列号。
举个例子:

这里面sequence 是2905,tcp大小是836,那么下一个sequence 就是3741
那么来看下ack:

这里ack 确认就是3741了。
值得注意的是下面有一个时间戳:

这个时间戳有什么用呢?
这个是为了防止序列号回绕的。
比如说:

假如b时间丢了这个b的数据序号是1G-2G,但是f点同时又在发1G到2G这个序号,然后又收到了来源于b的1G-2G序号。
那这个时候数据就串了,肯定希望收到的是1-6G这个顺序的视频吧,不可能到5-6g的时候突然窜出来1到2G的数据吧。
如果有 Timestamps 的存在,内核会维护一个为每个连接维护一个 ts_recent 值,记录最后一次通信的的 timestamps 值,
当收到的数据包中 timestamps 值小于 ts_recent 值,就会丢弃掉这个数据包。等收到的数据包的timestamps 值大于 ts_recent,这个包可以被正常接收。
实际上timestamps 值是一个单调递增的值,这个选项不要求两台主机进行时钟同步。
两端 timestamps 值增加的间隔也可能步调不一致,比如一条主机以每 1ms 加一的方式递增,另外一条主机可以以每 200ms 加一的方式递增。
此外,timestamps 是一个双向的选项,如果只要有一方不开启,双方都将停用。 在Linux下可以通过下面方式开启或关闭timestamp功能。
同时这个时间戳还有一个比较重要的用处,那就是确认rto时间。
什么是rtt呢?

就是一次发出请求到ack的时间。

这里面有两个单词:一个是tsval(ts value) 一个 是 tsec(ts echo reply)。
这个tsval 是 发送时间,tsec 是回显时间,也就是说对方发送的时间。
有这个回显时间,那么加上自己接收到的时间,那么就是rtt。
那么根据这个rtt (round trip time 来回时间)就可以计算出rto(retransmission timeout)

结
下一节 ip 层。为什么不介绍滑动窗口,直接到ip层了呢? 因为有一些ip只是需要用到,才更好的能理解为什么。
抓包整理————tcp 传输数据的基础概念[十一]的更多相关文章
- Wireshark抓包分析TCP建立/释放链接的过程以及状态变迁分析
Wireshark抓包分析TCP建立/释放链接的过程以及状态变迁分析 一.介绍计算机网络体系结构 1.计算机的网络体系结构 在抓包分析TCP建立链接之前首先了解下计算机的网络通信的模型,我相信学习过计 ...
- Wireshark数据抓包教程之Wireshark的基础知识
Wireshark数据抓包教程之Wireshark的基础知识 Wireshark的基础知识 在这个网络信息时代里,计算机安全始终是一个让人揪心的问题,网络安全则有过之而无不及.Wireshark作为国 ...
- 网络协议抓包分析——TCP传输控制协议(连接建立、释放)
前言 TCP协议为数据提供可靠的端到端的传输,处理数据的顺序和错误恢复,保证数据能够到达其应到达的地方.TCP协议是面向连接的,在两台主机使用TCP协议进行通信之前,会先建立一个TCP连接(三次握手) ...
- Wireshark抓包工具--TCP数据包seq ack等解读
1.Wireshark的数据包详情窗口,如果是用中括号[]括起来的,表示注释,在数据包中不占字节 2.在二进制窗口中,如“DD 3D”,表示两个字节,一个字节8位 3.TCP数据包中,seq表示这个包 ...
- wireshark抓包分析——TCP/IP协议
本文来自网易云社区 当我们需要跟踪网络有关的信息时,经常会说"抓包".这里抓包究竟是什么?抓到的包又能分析出什么?在本文中以TCP/IP协议为例,简单介绍TCP/IP协议以及如何通 ...
- [转]Wireshark抓包工具--TCP数据包seq ack等解读
原文: http://blog.csdn.net/wang7dao/article/details/16805337/ ---------------------------------------- ...
- 使用 tcpdump 抓包分析 TCP 三次握手、四次挥手与 TCP 状态转移
目录 文章目录 目录 前文列表 TCP 协议 图示三次握手与四次挥手 抓包结果 抓包分析 TCP 三次握手 数据传输 四次挥手 TCP 端口状态转移 状态转移 前文列表 <常用 tcpdump ...
- Wireshark抓包分析TCP“三次握手,四次挥手”
1.目的 客户端与服务器之间建立TCP/IP连接,我们知道是通过三次握手,四次挥手实现的,但是很多地方对这个知识的描述仅限于理论层面,这次我们通过网络抓包的方式来看一下实际的TCP/IP传输过程. 2 ...
- Wireshark抓包分析TCP 3次握手、4次挥手过程
Wireshark简介 更多有关Wireshark的教程.软件下载等,请见:http://www.52im.net/thread-259-1-1.html,本文只作简要介绍. 1Wireshark 是 ...
- Wireshark抓包分析/TCP/Http/Https及代理IP的识别
前言 坦白讲,没想好怎样的开头.辗转三年过去了.一切已经变化了许多,一切似乎从没有改变. 前段时间调研了一次代理相关的知识,简单整理一下分享之.如有错误,欢迎指正. 涉及 Proxy IP应用 原理/ ...
随机推荐
- Centos8 ssh配置三台虚拟机免密登录 root 及 非root 稍有差异;SSH的免密登录详细步骤
为了保证一台Linux主机的安全,所以我们每个主机登录的时候一般我们都设置账号密码登录.但是很多时候为了操作方便,我们都通过设置SSH免密码登录. 一.配置SSH 基本语法:假设要用用户名root登录 ...
- 国内RPA融资年终大盘点:19起投资总额破34亿估值近230亿,垂直落地之年开启
2021国内RPA融资年终盘点:15家厂商融资总额破34亿,估值近230亿 2021RPA融资年终大盘点:19起投资估值近230亿,垂直落地之年开启 2021国内RPA融资年终盘点:15家厂商19起投 ...
- 4- 信号量& 互斥量
信号量,计数值 问题: 还是那个AB任务互斥调度的问题,B等A执行完毕的过程中,判断标志位会耗费CPU资源 利用信号量,当没有信号的时候,不参与调度 计数信号量(不能用来传输数据) static S ...
- 简单实用算法—分布式自增ID算法snowflake(雪花算法)
目录 算法概述 ID结构 算法特性 算法代码(C#) 算法测试 算法概述 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先 ...
- kettle入门教程-表同步插入
在平时工作当中,会遇到这种情况,而且很常见.比如:增量抽取(每隔2个小时抽取截至到上次抽取时间的记录)一.操作前提:存在3张表,源表(t_student),同步日志表(t_tbrz),插入表(t_ta ...
- java之Timer类使用方法小例子
直接上代码: package com.iamzken.test; import java.util.Timer; import java.util.TimerTask; public class Te ...
- 优雅的处理挂载window上的函数可能不存在的情况
背景 在做一个Web JS SDK(A)时,内部会用到另一个Web JS SDK(B)的方法.(文中后续用A/B代替两者) B通常会提供Script和NPM包两种使用方式 使用npm pkg的缺点 增 ...
- 记录--你的网站如何接入QQ,微信登录
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 主要实现步骤 对接第三方平台,获取第三方平台的用户信息. 利用该用户信息,完成本应用的注册. qq登录接入 接入前的配置 qq互联 登录后 ...
- 记录--两行CSS让页面提升了近7倍渲染性能!
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 对于前端人员来讲,最令人头疼的应该就是页面性能了,当用户在访问一个页面时,总是希望它能够快速呈现在眼前并且是可交互状态.如果页面加载 ...
- Python利用pandas拆分大型的csv文件
当将大型CSV文件拆分成较小的文件时,您可以使用Python的Pandas库来处理 导入必要的库 import pandas as pd 定义拆分函数 当定义拆分函数时,我们将在以下步骤中处理CSV文 ...