三次握手协议:三次握手协议的主要过程是交互彼此之间的初始序列号,如果没有确认的ACK帧可以么?肯定是可以的

client A -------> server B

client A 发送了自己的初始序列号;然后B看见了之后B发送了一个初始序列号,这样两次“握手”都可以啊。但是两次握手的问题是:此时A开始发送信息,B肯定是收到了A的序列号了;B告诉A说我的序列号;二次握手基于的假设是:我发送结束后默认你已经知道了我的初始序列号是多少,但是现在的问题是B肯定是知道A的序列号了,所以B可以很自如地向A发送数据包,但是如果A一直没有发送数据包,那么是因为B的sync序列号的包没有达到,A不知道B的初始序列号所以没发呢?还是说A就是没有发送数据包,还是说A的数据包丢失了呢?B端充满了疑惑。好像是可以工作的,B端此时会超时重传,不断地去发送SYNC包告诉A说自己的初始序列号;那么这里就是整个问题的核心了:此时我如果A就是没有数据要发呢? 你B一遍遍给我发初始的序列号信息,1个,2个,3个,。。。。,此时A可以告诉你说序列号包我收到啦,别发了再(这不就是第三次握手的内容么)。。。所以,如果是两次握手的话,B的回复包没丢还好,如果丢了,那么至少还要发送两个数据包来确认问题!这是至少!因此还是要通过三次握手才行呢;三次握手,A和B都能达到一个终态,这个终态可以有效防止丢包的雪崩效应。如果B一直没有收到A的ack帧,那么就重发syncB,acka;如果A一直没有收到B的syncB,ackA,那么就重新发ackA;三次握手的一个最大的好处就是告诉B:A知道你的初始序列号是多少了,可能暂时不会有数据过来了,所以疑惑扫了一大堆。到这里其实建立的是A和B的全双工的链路。

那四次挥手又是解决啥问题呢?

A调用close是为了说啥呢?是说我这里不在对你B发送数据,还是告诉B我不再接受数据呢?是前者,告诉B我不再向你发送数据了(但是我这边仍然有段时间会接受到你的数据)或者说是申请关闭链接,你看着办吧。

ACK报文在TCP协议中超级重要,它可以很大程度防止丢包引起的重传。握手阶段的ACK上面已经分析过了;在真正的数据传输阶段呢,当A发送了1,2,3,4,5包,然后又发送了6,我怎么确定包是否是收到了呢?要不然我一个劲儿地发也没用呀,ACK帧的主要作用就是让A和B的信息透明。

ACK在整个TCP协议中的作用是信息透明,防止重传;

在结束的时候也是这样,如果A发送了FIN,如果好久没有相应,那么A怎么知道到底是因为数据包在A->B的路上丢了,还是B已经收到了,所以必须要让A心知肚明,此时B先发送一个ACK帧过来,通知A:我B收到了你的断开请求。【还是没有找到问题的根源。三次握手的第三个ACK包是为了降低B的疑惑,即当A迟迟没有发数据,不是因为A没有收到B的序列号,而是因为A本来就没有发过来数据,至于发过来的数据半路丢了,那就是A的事情了】那四次挥手呢?

四次挥手也是也是同样的道理,需要发送ACK帧表明对方确实已经收到了我的帧,以此表明我可以进入下一个状态,等待我期望的数据包,完成状态机的转换。WAIT状态确实可以防止新建立的客户端接收到老的tcp链接的数据包,因为服务器端在发送FIN(3)的数据包的时候已经保证之前的数据包都发送完毕了,这个FIN的目前的年龄肯定是小于之前发送给client的数据包的年龄的,所以clinet进入WAIT状态时等待的2mst就能够保证该端口不被占用。很巧妙。但是如果client端接受到服务器端的FIN(3)后发送给服务器的ack包对了咋办呢?知乎上的讨论

https://www.zhihu.com/question/27564314

先如知乎上说的这样记着吧,如果长时间得不到链接,服务器端的LAST_ACK就自动转化成close状态了。

整个网络模型就是自动机。

TCP的挥手协议和握手协议的更多相关文章

  1. TCP/IP的三次握手协议

    关于TCP/IP的三次握手协议,这篇文章中有详细的介绍,很通俗易懂,什么时候忘了,都可以过来瞧两眼,保证很快就明白了. 首先TCP/IP协议分为三个阶段:建立连接(握手阶段),数据传输阶段,连接终止阶 ...

  2. TCP的挥手协议和握手协议2

    三次握手协议:三次握手协议的主要过程是交互彼此之间的初始序列号,如果没有确认的ACK帧可以么?肯定是可以的 client A -------> server B client A 发送了自己的初 ...

  3. 最简单的理解 建立TCP连接 三次握手协议

     最简单的理解一:建立TCP连接:三次握手协议    客户端:我要对你讲话,你能听到吗:服务端:我能听到:而且我也要对你讲话,你能听到吗:客户端:我也能听到.…….互相开始通话…….. 二:关闭TCP ...

  4. SSL 握手协议详解

    这里重点介绍一下服务端的验证和密钥交换.这个阶段的前面的(a)证书 和(b)服务器密钥交换是基于密钥交换方法的.而在SSL中密钥交换算法有6种:无效(没有密钥交换).RSA.匿名Diffie-Hell ...

  5. SSL协议(HTTPS) 握手、工作流程详解(双向HTTPS流程)

    原文地址:http://www.cnblogs.com/jifeng/archive/2010/11/30/1891779.html SSL协议的工作流程: 服务器认证阶段:1)客户端向服务器发送一个 ...

  6. SSL协议的握手过程(摘录)

    SSL协议的握手过程 为了便于更好的认识和理解 SSL 协议,这里着重介绍 SSL 协议的握手协议.SSL 协议既用到了公钥加密技术(非对称加密)又用到了对称加密技术,SSL对传输内容的加密是采用的对 ...

  7. 【转】SSL协议、SET协议、HTTPS简介

    一.SSL协议简介 SSL是Secure Socket Layer的缩写,中文名为安全套接层协议层.使用该协议后,您提交的所有数据会首先加密后,再提交到网易邮箱,从而可以有效防止黑客盗取您的用户名.密 ...

  8. 软件开发架构介绍||OSI七层协议之物理层、数据链路层、网络层、传输层(mac地址、ip协议、断开协议、tcp协议之三次握手四次挥手)

    一.网络编程 软件开发架构 C/S架构 C:客户端 想体验服务的时候才会去找服务端体验服务 S:服务端   24小时不间断的提供服务,即时监听,随时待命 B/S架构 B:浏览器    想体验服务的时候 ...

  9. TCP连接三次握手协议,释放连接四次挥手,以及使用 awl伪造mac地址进行多线程syn洪泛攻击。

    这个TCP连接就是一次追女生-谈恋爱-分手,追求比分手简单,但是分手比追求复杂.哥,谈了半年的女朋友,在就快要成功了的时候分了,原因是因为有人在后面该老子背后搞SYN洪泛攻击,最后女朋友丢失了.学会T ...

随机推荐

  1. 洛谷P3804 【模板】后缀自动机

    题目描述 给定一个只包含小写字母的字符串 SS , 请你求出 SS 的所有出现次数不为 11 的子串的出现次数乘上该子串长度的最大值. 输入输出格式 输入格式: 一行一个仅包含小写字母的字符串 SS ...

  2. 【网络流】EK算法及其优化

    今天上午我仿佛知道了什么叫做网络流,这里推荐一篇博客,大家入门网络流的可以看一下这篇博客,保证一看就懂! 博客链接: 网络流入门 这里有一篇经过我改过的EK带注释代码(博客里也有一样的,只是加了一些注 ...

  3. jQuery(三)HTML

    获得内容: text() - 设置或返回所选元素的文本内容 html() - 设置或返回所选元素的内容(包括 HTML 标记) val() - 设置或返回表单字段的值 <html> < ...

  4. Linux : centOS 与 Ubuntu 安装 Nginx

    源码下载: wget http://nginx.org/download/nginx-1.14.0.tar.gz 解压:tar –zxvf xxx 安装依赖: yum -y install  open ...

  5. php+高德地图webapi 高德jsapi 实现 当前位置与目标位置距离 并按照距离排序(坐标逆转换)

    <script type="text/javascript" src="https://api.map.baidu.com/api?v=2.0&ak='自己 ...

  6. php-语言参考-类型3.2-未完待续

    一,PHP变量的8个类型 四种标量类型: boolean (布尔型) integer (整型) float (浮点型, 也称作 double) string (字符串) 两种复合类型: array ( ...

  7. mysql 5.7 配置初始化及修改 ROOT 用户密码

    1.修改配置文件 my.ini 放在 mysql\bin [mysqld] basedir=C:\Mysql datadir=C:\Mysql\data port=3306 # server_id = ...

  8. 《PHP内核探索系列文章》系列分享专栏

    <PHP内核探索系列文章>已整理成PDF文档,点击可直接下载至本地查阅 简介 PHP内核探索系列文章收藏夹收藏有关PHP内核方面的知识的文章,对PHP高级进阶的朋友提供PHP内核方面的知识 ...

  9. C语言Windows程序开发—TextOut函数介绍【第02天】

    (一)TextOut函数的参数介绍: BOOL TextOut ( //如果函数调用成功,返回TRUE,否则,返回FALSE HDC hdc, //用于显示字符串的控件ID int nXStart, ...

  10. python2.7练习小例子(二十六)

        26):题目:给一个不多于5位的正整数,要求:一.求它是几位数,二.逆序打印出各位数字.     程序分析:学会分解出每一位数.     程序源代码: #!/usr/bin/python # ...