| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> TCP相关 -> 正文阅读 |
|
[网络协议]TCP相关 |
一、三次握手 TCP:传输控制协议。面向连接的,可靠的。 在建立连接时,tcp协议采用经典的三次握手机制。 三次握手中TCP报文的seq,ack,SYN和ACK起到了关键性作用。Seq是报文中32位二进制的数据号,ack是32位的确认号(和ACK区分开)。SYN和ACK则都是1位的标志位。? 三次握手的具体实现过程: 1. 第一次握手:Client(客户端主机A)向Server(服务器主机B)发送一个连接请求,在这个包中,标志位SYN=1,发送序号seq=x。Client(客户端)进入SYN_SEND(已发送)状态,等待Server(服务器)确认。 2. 第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,确认序号ack=x+1,随机产生一个发送序号SEQ=y,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD(已接收)状态。 3.第三次握手:Client收到确认后,检查确认序号ack是否为x+1,标志位ACK是否为1,如果正确,则将标志位ACK置为1,确认序号ack=y+1,并将该数据包发送给Server,Server检查确认序号ACK是否为y+1,标志位ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED(已建立)状态。 三次握手的目的: 三次握手的目的是要确认对方收到了自己的数据包,或者说双方都要确认彼此的收发能力正常这个目标就是通过“确认号(ack)”字段实现的。计算机会记录下自己发送的数据包序号Seq,待收到对方的数据包后,检测“确认号(ack)”字段,检查ack=seq+1是否成立。 个人理解: 在三次握手中,服务器和客户端各自发送了一个seq,并且收到了对应的ack = seq+1。从而确定了双方接收,发送的能力都没有问题。 第一次握手:服务器收到客户端数据包,服务器确认服务器接收能力和客户端发送能力正常。 第二次握手:? 客户端收到服务器数据包, 客户端确认服务器发送能力,接收能力和客户端发送能力,接收能力正常。 第三次握手:服务器再次收到客户端数据包,服务器确认了服务器发送能力正常。 至此,双方都确认了彼此的收+发能力都正常,连接建立。 ?
二、四次挥手 在TCP断开连接时,会发送四个数据包用于确认断开,称为四次挥手。 ?四次挥手具体过程: 第一次挥手:当客户A要断开TCP连接时,发送一个包,其中标志位fin=1,ACK=1,发送序号seq=x,确认序号ack=y。Client进入FIN_WAIT_1状态(已发送fin,等待回复)。 由于TCP连接是全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。 为什么关闭连接是四次挥手呢? 因为服务器收到FIN报文时,往往并不能直接关闭socket,因为可能有一些数据还没有发送完成。因此在四次挥手过程中,第二和第三次挥手是分两步进行。而在建立连接时,不需要考虑关闭问题,这两步可以合为一次握手。 为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态? 1.保证可靠关闭。如果在此时第四次握手没有成功,服务端则会继续发送FIN,而客户端会再次返回ACK,以确保服务端能够正确收到ACK并关闭。 2.保证所有的数据都已经发送。假设客户端在关闭之后又重新建立连接,TCP协议判断不同连接的依据是socket pair,而新连接的端口号又可能和老连接相同。此时如果有残存在网络中的数据,则会被认为是新连接的数据,产生混乱。 |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 7:33:34- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |