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

web----tcp三次握手相关推荐

  1. 内网PC通过NAT server公网地址访问内部服务器时TCP三次握手不成功

    公网地址访问内部服务器时TCP三次握手不成功   一.  背景 在上图所示的网络中,PC 及Server属不同LAN,都是zone trust.为了让Internet用户能够访问到Server,FW上 ...

  2. TCP三次握手Render Tree页面渲染=从输入URL到页面显示的过程?

    最近工作之余一直在温故js系列,想知新,想提升,以小技术点为节奏去回顾.今天突然想到回顾一下这个http知识,http知识有太多深层次需要学习,今天简要回顾,浅析下这个技术点. 主要通过五个步骤浅析这 ...

  3. 通过实验取证:TCP三次握手的过程

    通过实验取证:TCP三次握手的过程 理解TCP/IP协议的工作原理 多年来TCP/IP协议一直被公众称呼为"一个协议",事实上它是一组协议的集合,IP工作在OSI七层模型的网络层, ...

  4. 第三次握手为什么没有序列号_图解TCP三次握手与四次分手

    TCP三次握手和四次挥手不管是在开发还是面试中都是一个非常重要的知识点,它是我们优化web程序性能的基础.但是大部分教材都对这部分解释的比较抽象,本文我们就利用wireshark来抓包以真正体会整个流 ...

  5. TCP三次握手、四次挥手、socket,tcp,http三者之间的区别和原理

    接着上一篇文章叙述: TCP/IP连接(在互联网的通信中,永远是客户端主动连接到服务端): 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.TCP协 ...

  6. 脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手

    转自即时通讯网:http://www.52im.net/ 1.引言 网络编程中TCP协议的三次握手和四次挥手的问题,在面试中是最为常见的知识点之一.很多读者都知道"三次"和&quo ...

  7. TCP/IP协议详解、TCP三次握手

    TCP/IP协议详解:TCP/IP协议详解_王佳斌-CSDN博客_tcp/ip协议认识HTTP协议它是互联网协议(Internet Protocol Suite),一个网络通信模型,是互联网的一个基本 ...

  8. TCP三次握手之-awl工具-SYN洪水攻击

    文章目录 云盾数据 TCP三次握手 TCP报文段的头部格式 实战-使用tcpdump 抓包 tcpdump 常用参数 tcpdmp 抓包 awl -syn-洪水攻击 原理 实战 总结: 云盾数据 - ...

  9. 【Linux云计算架构:第三阶段-Linux高级运维架构】第26章——tcp三次握手四次挥手及在局域网中使用 awl伪装MAC地址进行多线程SYN攻击

    25.1 tcp三次握手及tcp连接状态(含tcpdum抓包分析) 25.2 tcp四次挥手及tcp连接状态 25.3 实战:在局域网中使用 awl伪装MAC地址进行多线程SYN攻击 ssh 客户端: ...

  10. 对tcp三次握手的详解之 理解TCP序列号(Sequence Number)和确认号(Acknowledgment Number)

    重要 !!!!!!!!!       转载自[怀揣梦想,努力前行] 对tcp三次握手的详解之 理解TCP序列号(Sequence Number)和确认号(Acknowledgment Number) ...

最新文章

  1. cent卸载mysql_centos 7.x 安装/卸载MySQL
  2. python中为什么需要使用“if __name__ == '__main__'”语句
  3. python 利用pyttsx3文字转语音 适用于macOS windows树莓派
  4. BufferedReader 中的 readLine()
  5. python args kw_Python基础-参数魔法,*args,**kwags
  6. python 与或非_Java、PHP和Python各有什么优势 分别能做什么
  7. Linux Crontab内环境变量与Shell环境变量的关系及解决问题的办法
  8. MySQL日志(一条sql更新语句是如何执行的)
  9. matlab 带积分的方程,在Matlab中实现积分方程的迭代解
  10. Java微信授权登陆
  11. 连接共享打印机时提示无法访问计算机,win10共享打印机提示无法访问.你可能没有权限使用网络资源怎么解决...
  12. 明明有 Windows 11,为什么还要用国产操作系统?
  13. 苹果手机热点连上不能上网_「手机自学维修教程」苹果6plus手机屏幕触摸不能用的通病分析...
  14. 抖音矩阵系统,抖音矩阵系统源码,抖音SEO源码独立部署。
  15. Codeforces869E The Untended Antiquity
  16. 示波器的使用以及基本原理
  17. Go netpoll I/O 多路复用构建原生网络模型之源码深度解析
  18. 时评:所谓游戏人才六十万缺口背后
  19. 手游图片素材提取_如果你想获得心爱手游中的图片素材,可以试试这款软件!...
  20. java英里转换成千米_英里和公里怎么换算

热门文章

  1. CSS之两栏固定布局(二)
  2. 南邮 计算机网络,南邮计算机网络_期末复习纲要-精简版教材.pdf
  3. vim 删除行_【收藏】138条 Vim 命令、操作、快捷键全
  4. linux内核多队列,Linux Kernel 中 Workqueue 使用系统默认队列和创建队列的方法
  5. 解决虚拟机VMware安装CentOS7.0识别不到网卡
  6. Java连接SQL数据库失败的分析思路
  7. 使用HTMLParser模块解析HTML页面
  8. mysql数据库root密码在哪个文件中_mysql - 本地数据库忘记了root用户的密码
  9. imagemagick for java_ImageMagick使用for java(im4java)
  10. 【objectMapper实体转换异常】 com.fasterxml.jackson.databind.exc.MismatchedInputException