握手通俗理解为两个人见面Say Hai,客户端和服务端建立连接
挥手就可以理解为两个人结束会面,要Say Goodbai,客户端和服务端断开连接
要了解什么是三握四挥,必须要了解一个重要的知识点:什么是TCP报文格式,也就是三握四挥中传送的内容是什么,遇到什么格式才能触发服务端和客户端的交流。
TCP报文是TCP层传输的数据单元,也叫报文段
从上向下依次来看:
1)源端口:源端口和IP地址是标识报文的返回地址
2)目的端口:端口指明接收方计算机上的应用程序接口
TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接
1)序号:seq(4字节 = 32位)每一个报文都有自己的序号,这个是根据计算机自动生成的,用来唯一标识当前报文。在TCP传送的流中,每一个字节一个序号。
比如:一个报文段的序号为 300,此报文段数据部分共有 100 字节,则下一个报文段的序号为 400 。所以序号确保了 TCP 传输的有序性。
2)确认序号:(4字节 = 32位)一般用小写 ack 表示,指明下一个期待收到的字节序号,表明该序号之前的所有数据已经正确无误的收到。
由于首部可能含有可选项内容,因此TCP报头的长度是不确定的,报头不包含任何任选字段则长度为20字节,4位首部长度字段所能表示的最大值为1111,转化为10进制为15,15*32/8 = 60,故报头最大长度为60字节。首部长度也叫数据偏移,是因为首部长度实际上指示了数据区在报文段中的起始偏移值。
1)URG:紧急指针标志,为 1 时表示紧急指针有效,为 0 则忽略紧急指针。
2)ACK:确认序号标志,为 1 时表示确认号有效,为 0 表示报文中不含确认信息,忽略确认号字段。
3)PSH:push 标志,为 1 表示是带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。
4)RST:重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。
5)SYN:同步序号,用于建立连接过程,在连接请求中,SYN = 1 和 ACK = 0 表示该数据段没有使用捎带的确认域,SYN = 1 和 ACK = 1 为连接应答捎带一个确认 。
6)FIN:finish 标志,用于释放连接,为 1 时表示发送方已经没有数据发送了,即关闭本方数据流。
用来告知发送端接受端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小时一个16bit字段,因而窗口大小最大为65535。
此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。由发送端计算和存储,并由接收端进行验证。
紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。
每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍。
在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。
便于理解图:
实际:
TCP协议是传输层的一个面向连接的安全可靠的传输协议,三次握手的机制是保证能建立一个安全可靠的连接。
(为什么两次握手不行?)以上两次握手之后,对于客户端来说已经知道,我既能给服务端发消息也能收到服务端发的消息,但是对于服务端来说,两次握手是不够的,因为,到目前为止,服务端只知道一件事情,客户端发给我的消息我能收到,我发给客户端的消息能不能收到不能确认。
通过以上三次连接,不管是客户端还是服务端,都能确认我既能给对方发消息,也能收到对方的消息,那么这个连接可以被安全的建立。
便于理解图:
实际图:
因为在这两次握手之后,对于客户端来说,发送和接收都没有问题,但是对于服务器,只知道接受没有问题,发送的消息客户端有没有收到,服务器是不知道的,因此需要第三次握手,第三次握手保证了客户端和服务端既能给对方发送消息,又能响应对方。
这是两种情况,第一种是把服务器的确认ACK和连接SYN分两次发送,这种在理论上是可行的,就好比
服务器:我在
服务器:你在吗?
但是一次性能干完的事情,非分两次,太浪费资源了。
第二种情况就是客户端再次发送确认消息,也是同理,三次握手就已经保证了双方的连接是可靠的,客户端再确认也是浪费资源
当客户端发送断开请求给服务端时(第一次挥手),服务端首先应该回复客户端确认收到(第二次挥手),但此时不确定服务端是否准备好(是否有未处理完的消息),所以应该等服务端处理好之后,再发送断开消息给客户端,告诉客户端已经准备好断开了(第三次挥手),这样客户端收到消息就会知道服务端已经准备好,可以断开,但此时客户端要给服务端发送确认收到的消息(第四次挥手),这样便确保了整个挥手断开过程顺利进行。
文章浏览阅读3.8k次,点赞9次,收藏28次。直接上一个工作中碰到的问题,另外一个系统开启多线程调用我这边的接口,然后我这边会开启多线程批量查询第三方接口并且返回给调用方。使用的是两三年前别人遗留下来的方法,放到线上后发现确实是可以正常取到结果,但是一旦调用,CPU占用就直接100%(部署环境是win server服务器)。因此查看了下相关的老代码并使用JProfiler查看发现是在某个while循环的时候有问题。具体项目代码就不贴了,类似于下面这段代码。while(flag) {//your code;}这里的flag._main函数使用while(1)循环cpu占用99
文章浏览阅读347次。idea shift f6 快捷键无效_idea shift +f6快捷键不生效
文章浏览阅读135次。Ecmacript 中没有DOM 和 BOM核心模块Node为JavaScript提供了很多服务器级别,这些API绝大多数都被包装到了一个具名和核心模块中了,例如文件操作的 fs 核心模块 ,http服务构建的http 模块 path 路径操作模块 os 操作系统信息模块// 用来获取机器信息的var os = require('os')// 用来操作路径的var path = require('path')// 获取当前机器的 CPU 信息console.log(os.cpus._node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是
文章浏览阅读10w+次,点赞435次,收藏3.4k次。SPSS 22 下载安装过程7.6 方差分析与回归分析的SPSS实现7.6.1 SPSS软件概述1 SPSS版本与安装2 SPSS界面3 SPSS特点4 SPSS数据7.6.2 SPSS与方差分析1 单因素方差分析2 双因素方差分析7.6.3 SPSS与回归分析SPSS回归分析过程牙膏价格问题的回归分析_化工数学模型数据回归软件
文章浏览阅读7.5k次。如何利用hutool工具包实现邮件发送功能呢?1、首先引入hutool依赖<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.19</version></dependency>2、编写邮件发送工具类package com.pc.c..._hutool发送邮件
文章浏览阅读867次,点赞2次,收藏2次。docker安装elasticsearch,elasticsearch-head,kibana,ik分词器安装方式基本有两种,一种是pull的方式,一种是Dockerfile的方式,由于pull的方式pull下来后还需配置许多东西且不便于复用,个人比较喜欢使用Dockerfile的方式所有docker支持的镜像基本都在https://hub.docker.com/docker的官网上能找到合..._docker安装kibana连接elasticsearch并且elasticsearch有密码
文章浏览阅读1.3w次,点赞57次,收藏92次。整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)近年来,随着机器学习的兴起,有一门编程语言逐渐变得火热——Python。得益于其针对机器学习提供了大量开源框架和第三方模块,内置..._beeware
文章浏览阅读7.9k次。//// ViewController.swift// Day_10_Timer//// Created by dongqiangfei on 2018/10/15.// Copyright 2018年 飞飞. All rights reserved.//import UIKitclass ViewController: UIViewController { ..._swift timer 暂停
文章浏览阅读986次,点赞2次,收藏2次。1.硬性等待让当前线程暂停执行,应用场景:代码执行速度太快了,但是UI元素没有立马加载出来,造成两者不同步,这时候就可以让代码等待一下,再去执行找元素的动作线程休眠,强制等待 Thread.sleep(long mills)package com.example.demo;import org.junit.jupiter.api.Test;import org.openqa.selenium.By;import org.openqa.selenium.firefox.Firefox.._元素三大等待
文章浏览阅读3k次,点赞4次,收藏14次。Java软件工程师职位分析_java岗位分析
文章浏览阅读2k次。Java:Unreachable code的解决方法_java unreachable code
文章浏览阅读1w次。1、html中设置标签data-*的值 标题 11111 222222、点击获取当前标签的data-url的值$('dd').on('click', function() { var urlVal = $(this).data('ur_如何根据data-*属性获取对应的标签对象