浅入tcp

1.认识TCP

  tcp协议是传输层协议,它的最主要的3个特点是面向连接、可靠保证、基于字节流。当应用层把数据给tcp层时,注意如果数据大于MSS是要在tcp层进行分段的。tcp协议为了保证不丢包会给每个包一个序号,接受方成功收到数据包后回回复一个确认,这个过程是在小于传输延迟RTT的时间内的。如果发送方在RTT时间内没有收到确认就会重传已丢失的数据包。说到要在tcp层进行分段我就想到老师经常提到以太网数据包的长度要小于或等于1518和大于或等于46字节,但我却还不知道是什么原因。还有一个问题,在tcp层会对数据进行分段,它和分片的区别是什么。

问题一:为什么以太网数据帧大小在64字节和1518字节之间?

  可以想象A给B发数据,发送数据这个过程本身是需要时间的,现在已经有部分数据在传输链路上了,B这时也准备发送数据。那么B这时就会检测到冲突并将冲突信号返回给A,如果冲突信号返回给A时,A的数据还没发送完那么A就知道有冲突,这样数据就会选择合适的时间重发。如果冲突信号到达A时A已经把数据发送完了,那么A就不会重传数据了。所以在一个往返时间内,数据不能发送完,因此以太网数据帧最小为64字节。如果数据帧太大,一方面其他主机需要长时间等待,一方面可能造成接受方缓冲区溢出,因此数据帧一定要小于一个值,至于为什么是1518那就是数学和其他多方面考虑得出的结果了。

问题二:Tcp层的分片和IP层的分片有什么区别?

  我刚开始在TCP百度百科查看到“然后TCP把数据流分区成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元([1]  MTU)的限制)”这样一句话。我觉得很奇怪,tcp层的分段难道还和数据链路层的MTU有关系,既然已经有了IP分片,tcp层分段有什么意义呢?查阅资料后发现tcp分段是根据最大传输单元MSS来进行的,MSS是建立tcp连接后,双方协商的进行通信时所能承受的最大数据长度。当使用IP分片时有一个最大的缺点那就是一旦丢失一个分片,就会重新传输整个数据报。采用tcp分段的话它的数据长度是要小于MSS的,而MSS是小于MTU的,这样的话就将重传机制就交给tcp负责了。

2.TCP连接建立与释放

  昨天参加笔试这个地方就没有答的很深入,只说了一个大概。所以今天得认真的学习下tcp,确实网络挺重要的。tcp连接断开主要是三次握手和四次握手,下面是我总结的一个表格。

建立连接 参数字段 状态
客户端请求服务器 SYN=1,seq=x,SYN报文段不能携带数据。 客户端进入SYN-SENT状态
服务器回复客户端 SYN=1,ACK=1,seq=y,确认号ack=x+1,仍然不能携带数据。 服务器进入SYN-RCVD状态
客户端回应服务器 ACK=1,seq=y+1,确认号ack=x+1。 服务器收到后客户端和服务器同时进入ESTABLISHED状态
释放连接 参数字段 状态
A向B发送连接释放报文 FIN=1,seq=u。 A进入FIN-WAIT-1状态,等待B的确认。
B回复确认 ACK=1,seq=v,ack=u+1。 B进入CLOSE-WAIT,这时B的tcp进程通知高层进程去释放连接,B进入半关闭状态,这个时候B不会接受数据但是可能发送数据。
A收到确认后  不会发送数据包  A进入FIN-WAIT-2状态,等待B发出连接释放数据报
 B发送连接释放数据包 FIN=1,ACK=1,seq=w,ack=u+1。   B进入LAST-ACk最后确认状态,等待A的确认。
A收到B的连接释放包后,返回确认。 ACK=1,seq=u+1,ack=w+1。  发送数据后,A进入到TIME-WAIT状态,现在TCP连接还没有释放掉,必须经过时间等待计时器设置的时间2MSL(时间等待状态)后A才能进入到CLOSED状态。B收到数据报后也会进入CLOSED状态,这样A和B就断开连接了。

问题三:为什么A在发送确认数据后必须等待2MSL时间呢?

  有2个理由,第一是最后一个A发送确认报文后,这个报文有可能丢失。如果B收不到A已发送确认报文那么B会重传FIN+ACK报文段,A经过2MSL的好处就体现在这了,在2MSL内A还可以收到B重传的数据包。A收到重传的数据后会再重传一次确认,重新启动2MSL计时器。第二点是就是可以产生一个延迟,在2MSL时间内可保证本连接持续时间内所产生的报文段从网络中消失,这样就可以使下一个新的连接中不会出现上一次的数据报文段。

3.TCP的可靠性与拥塞控制

  TCP的可靠性主要体现在滑动窗口机制和超时重传。tcp的滑动窗口是以字节为单位的,当发送方发送数据时,接收方收到数据后会对收到的数据进行确认,发送方只有收到接收方的确认后才会将滑动窗口向前移动。滑动窗口机制可以保证数据被可靠的接受。每当发送方发送一个数据段时,就会启动一个重传定时器,如果在重传超时前收到确认则会停止定时器,否则就会重传该数据段。另外TCP会保持首部和数据的校验和,当校验和有差错时,TCP将会丢弃这个报文段且不会确认收到此数据包,这样做还有一个目的就是希望发送端超时重传。TCP还能提供流量控制,发送方或接受方会相互通信传递自己的缓冲区大小,这样发送方只会给接收方发送接收方可以容纳的数据,这可以防止缓冲区溢出。

  拥塞控制的目的就是为了防止过多的数据注入到网络中,这样可使网络中的路由器或链路不致过度负荷,而且实现拥塞控制的前提是网络可以承受现有的负荷。拥塞控制常常和流量控制搞混淆,我觉得可以从相同点与不同点去看这个问题。本来拥塞控制算法说到底就是告诉发送端你要减慢发送数据了,网络现在有麻烦了你必须降低流量的出口,这点和流量控制是很相似的。但是拥塞控制是一个全局的过程,而流量控制往往是点对点通信量的控制,是端到端的关系。流量控制所要做得事情就是需要发送方减慢发送速度时抑制发送方的发送速度让接收方来得及接受。进行拥塞控制主要是根据一些指标来判断当前网络的状况,比如超时重传的分组数或丢弃的数据包百分比等等。网络系统进行控制肯定是很复杂的,我这里主要是总结课本上的4个算法,了解了网络拥塞控制的基本原理。其中慢开始算法和拥塞控制算法一起结合使用。慢开始、快重传和快恢复结合使用,但是慢开始仅仅在tcp建立连接时和网络出现超时时才使用。

序号 过程描述 发送方 接收方 状态
1 网络正常情况 维持拥塞窗口的状态变量,大小取决于网络的拥塞程度。 做好接受数据的准备, 发送方会让发送窗口大小等于拥塞窗口大小,这个窗口大小是动态变化的且原则是只要没出现网络拥塞,拥塞窗口就会增大一些。
2 发送方开始发送数据 探测拥塞窗口并逐渐由小增大拥塞窗口的数值,当开始发送报文段时会将发送窗口增加为MSS的数值。 接受方对结果进行回复确认 接受方每收到一个新的报文段的确认后就会增加最多一个MSS大小的窗口值。这个过程为慢算法,就是每完成一个传输过程,拥塞窗口就会增加。
3 是否达到慢开始门限 为了防止拥塞窗口过度增加会设置一个慢开始门限ssthresh变量。 接受方接受数据 如果拥塞窗口小于ssthresh继续执行慢开始算法,如果是大于则停止使用慢开始算法而改用拥塞避免算法。如果是等于的话两种算法都可以执行。这里假设要改用拥塞避免算法。
4 发送方开始执行拥塞避免算法 发送方的拥塞窗口不会成倍或以较快的速度的增加,而是以一种较小的速率去增加拥塞窗口大小。 接受方对结果进行回复确认 发送方根据动态改变的发送窗口大小发送数据。
5 发送方发现拥塞 发送方没有收到接收方的确认回复 接收方没有收到数据包或者回复数据包被丢失 慢开始门限会直接设置为拥塞时的发送窗口值的一半(它是存在一个最小值的),拥塞窗口直接降为初始值开始执行慢开始算法。
6 执行序号2后使用快重传算法 发送方正常发送数据 接收方每收到一个失序的报文段就会立即发出重复确认。  这样接收方就能很快的知道有数据段没有正确的被接收方接受。快重传规定只要接收方连续收到三个重复确认就会赶快重传确认数据包里说明的下一个数据段,而不是等待为丢失报文设置的计时器。
 7  执行快重传算法时会同时执行快恢复算法  现在发送方收到3个重复确认  接收方继续监听数据  发送方会将慢开始门限ssthresh减半,这是为了预防网络发送拥塞,因为发送方没有及时收到正确的数据段序号很有可能是网络出现拥塞。接着不会执行慢开始算法,即不会将拥塞窗口值降为初始值而是为此时ssthresh的数值。
时间: 2024-08-24 11:24:18

浅入tcp的相关文章

包学会之浅入浅出Vue.js:升学篇

上一篇<包学会之浅入浅出Vue.js:开学篇>中,我们初步了解单页面组件这个概念,现在通过一个项目,来进一步解析组件的应用吧,Go~ 需求背景 组件库是做UI和前端日常需求中经常用到的,把一个按钮,导航,列表之类的元素封装起来,方便日常使用,调用方法只需直接写上<qui-button></qui-button>或者<qui-nav></qui-nav>这样的代码就可以,是不是很方便呢,接下来我们将要完成以下页面: 这是我们组件库的首页,包含三个子

浅入浅出SQL注入

已经开始了学习牛腩新闻发布系统,在讲后台代码的时候讲了一些重构SQLHelper的知识,存储过程和触发器等,这些以前都是接触过的.而SQL注入是以前没有注意过的,所以停下来总结学习一下SQL注入. 首先什么是SQL注入呢? 实战篇~~~~~~~~~~ SQL注入概念 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到

浅入深出ElasticSearch构建高性能搜索架构

浅入深出ElasticSearch构建高性能搜索架构  课程学习地址:http://www.xuetuwuyou.com/course/161 课程出自学途无忧网:http://www.xuetuwuyou.com 一.课程用到的软件 ElasticSearch5.0.0 Spring Tool Suite 3.8.2.RELEASE Maven3.0.5 Spring4 Netty4 Hadoop2.7.1 Kibana5.0 JDK1.8.0_111 二.课程目标 1.快速学习Elastic

包学会之浅入浅出Vue.js:结业篇

在第一篇<包学会之浅入浅出Vue.js:开学篇>和上一篇<包学会之浅入浅出Vue.js:升学篇>的学习中,我们首先了解了Vue环境的搭建以及两个重要思想--路由和组件的学习,通过组件库中的按钮组件和导航组件,相信大家也开始了解相应的知识点,接下来我们会详细分析下如何完成由多个组件组成一个复用组件的开发流程. 下面先看看我们的需求 列表组件quiList.vue 本节我们主要要完成这样一个列表功能,每一行的列表是一个组件,列表内可能出现按钮组件或者箭头组件,点击按钮组件可以自定义事件

浅入浅出---JQuery到底是什么?

学习完了JQuery之后,我便感觉云里雾里的,JQuery到底是什么,朦朦胧胧感觉到JQuery应该是javascript函数的封装,就应该像WinForm窗体应用程序中可以调用的系统函数,据之前所学的javascript,知道JavaScript是一种镶嵌在HTML文档中的一种脚本语言, <body> <formid="form1" name="form1" method="post" > <label for=&

C#事件浅入

为什么要使用事件呢?举个简单的例子,比如说你的界面上有个bottom按钮,然后你写了一个点击一下这个按钮就弹出一个消息窗口的代码,然而你要弹出消息窗口的这个事,开发控件的人并不知道,所以开发者预先定义好了这个事件,他并不关心你点击这个按钮要干什么,但是按钮却通过点击事件调用了你的代码. 其实事件说简单点:就像委托一样,只是他多了一个约束,这个约束就是当XXX达到了某个时刻(某个点),然后就触发了XXX事情: 还不理解,没关系,看个小例子:大家平时都喜欢关注微博吧,就拿这个做个例子吧,可能不是很好

浅入浅出EmguCv(一)OpenCv与EmguCv

最近接触计算机视觉方面的东西,于是准备下手学习opencv,从官网下载windows的安装版,配置环境,一系列步骤走完后,准备按照惯例弄个HelloWord.也就是按照网上的教程,打开了那个图像处理领域非常有名的lena图片(据说是个裸女\(^o^)/~). 正当我摩拳擦掌准备开始opencv学习之旅的时候,习惯了GUI的我突然觉得用C++做开发弄界面很麻烦,不如用C#来的方便,于是又发现了一个封装了opencv的.net库,可以被VC++,VC#,VB.net调用,即EmguCV.网上对于Em

浅入浅出EmguCv(三)EmguCv打开指定视频

打开视频的思路跟打开图片的思路是一样的,只不过视频是由一帧帧图片组成,因此,打开视频的处理程序有一个连续的获取图片并逐帧显示的处理过程.GUI同<浅入浅出EmguCv(二)EmguCv打开指定图片>一样,只不过处理程序编程如下所示: 1 /// <summary> 2 /// 点击按钮打开指定图片 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <pa

浅入深出之Java集合框架(下)

Java中的集合框架(下) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,哈哈这篇其实也还是基础,惊不惊喜意不意外 ̄▽ ̄ 写文真的好累,懒得写了.. 温馨提醒:建议从(上)开始看哦~ 目 录 浅入深出之Java集合框架(上) 浅入深出之Java集合框架(中)   浅入深出之Java集合框架(下) 前 言 在<浅入深出之Java集合框架(中) >中介绍了Map接口的基本操作.使用的示例是在<浅入深出之Java集合框架(上)>中的模拟学