博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
web----tcp三次握手
阅读量:5124 次
发布时间:2019-06-13

本文共 1599 字,大约阅读时间需要 5 分钟。

1、首先为什么需要握手

首先我们看一下TCP报文段的结构

TCP报文段中的窗口这16位字段部分,这里窗口的作用就是为了实现流量的控制,为什么会有流量的控制的引入???它是这样来的:若是发送方发送数据的速度大于了接收方应用程序取数据的速度(假设数据传输过程不拥塞)那么,接收方就会出现失贞的现象,也就是把数据覆盖了,所以数据的发送就要得到控制,就引入了窗口这16位。怎么引入的??

发送方和接收方都有一个缓存区(用来接收从网络传来的数据,并提交给应用程序),对于接收方来说,它要维护两个变量值,一个是应用程序从缓存读出去的数据(out来表示);另一个是从网络接收的数据(in来表示),那么在接收方一个缓存里面剩余的空间就是Buffer-(in - out) = window(假设Buffer表示缓存的数量个数,in - out 表示应用程序没读的个数,也就是缓存被占用的个数,总的减去占用的就是可以利用的空间的个数用window来表示),那么这个window就是窗口所要写入的值,接受方会把这个值传递给发送方表示我还有多少空间可以利用。

同样发送方也会有一个缓存,同样要维持两个变量值:一个是已经发送的数据个数(send);另一个是已经得到确认的数据个数(acked),那么send - acked就表示已经发送出去了,但是还没有得到确认的数据的个数,换句话就是正在传输的数据(这样理解好点,但是有点不对),那么要让接收方缓存数据不被覆盖,那么正在发送的数据要小于接收方的窗口(send - acked < window)。

在简单说一下三次握手的过程:

第一次,客户机发送TCP短报文。

第二次,服务器发送应答,并建立缓存和变量。

第三次,客户机发送应答,并建立缓存和变量。

注意也就是在三次握手时就建立了缓存,那么也就是说,A与B要通信,两者之间必须先约定好一些参数,比如这里的缓存,那么依据上面的理论来说,建立缓存的目的就是为了避免不可靠的传输数据(也就是为了避免数据被覆盖),所以在传输数据之前,两者之间先做一些约定,换句话就是在做交易时先谈好地点和时间,在做交易。

那么,总的来说,所谓的链接就是为了分配内存等资源,然后避免不可靠的传输,以免污了TCP可靠传输的名头!!!

2、为什么需要握手3次

TCP的三次握手最主要是防止已过期的连接再次传到被连接的主机。 如果采用两次的话,会出现下面这种情况。 比如是A机要连到B机,结果发送的连接信息由于某种原因没有到达B机; 于是,A机又发了一次,结果这次B收到了,于是就发信息回来,两机就连接。 传完东西后,断开。 结果这时候,原先没有到达的连接信息突然又传到了B机,于是B机发信息给A,然后B机就以为和A连上了,这个时候B机就在等待A传东西过去。 2. 三次握手改成仅需要两次 握手,死锁是可能发生 考虑计算机A和B之间的通信,假定B给A发送一个连接请求分组,A收到了这个分组,并发送了确认应答分组。按照两次握手的协定,A认为连接已经成功地建立了,可以开始发送数据分组。可是,B在A的应答分组在传输中被丢失的情况下,将不知道A是否已准备好,不知道A建议什么样的序列号,B甚至怀疑A是否收到自己的连接请求分组。在这种情况下,B认为连接还未建立成功,将忽略A发来的任何数据分组,只等待连接确认应答分组。这样就形成了死锁

 

TCP中的seq

TCP连接中传送的字节流中的每个字节都按顺序编号,第一个字节的编号由本地随机产生

seq其实就是这个报文段中的第一个字节的数据编号。

例如,一段报文的序号字段值是 200 ,而携带的数据共有100字段,显然下一个报文段(如果还有的话)的数据序号应该从300开始;

[200,300)长为100!!!

 

转载于:https://www.cnblogs.com/yanxiaoge/p/11565944.html

你可能感兴趣的文章
Android项目实战(二十二):启动另一个APP or 重启本APP
查看>>
VS生成Cordova for Android应用之Gradle
查看>>
ArcGIS for Desktop入门教程_第八章_Desktop学习资源 - ArcGIS知乎-新一代ArcGIS问答社区...
查看>>
VSTO 得到Office文档的选中内容(Word、Excel、PPT、Outlook)
查看>>
Ubuntu 14.04 LAMP搭建(Apache 2.47+MySQL 5.5+PHP5.5)
查看>>
使用.net备份和还原数据库
查看>>
ActiveReports 报表控件官方中文入门教程 (2)-创建、数据源、浏览以及发布
查看>>
asp.net使用post方式action到另一个页面,在另一个页面接受form表单的值!(报错,已解决!)...
查看>>
一些有用的javascript实例分析(二)
查看>>
Android_Kotlin 代码学习
查看>>
关于android:windowNoTitle不起作用的解决办法
查看>>
关于使用Transaction对于非数据库事务的操作
查看>>
私钥公钥学习心得(二)比特币与支付宝
查看>>
瀑布流插件|jquery.masonry|使用demo
查看>>
Exchange Version and UpdateRollups
查看>>
渗透测试流程(单台服务器)
查看>>
Java进阶07 嵌套类
查看>>
gcc 4.9编译
查看>>
Web请求中同步与异步的区别
查看>>
hashCode()方法的作用&使用分析
查看>>