| |
|
开发:
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协议 |
1 TCP概述?2 TCP协议的实现?2.1 TCP协议的可靠数据传输? ? ? ? ?TCP协议的ACK和GBN协议是一样的,都是累加式的,即ACK之前的数据都已经收到了,接收方返回的ACK就是下一个希望接受到的。 ? ? ? ? ?如果发送方一直从接收方接受同一个ACK,就说明这个数据很有可能丢了,因为接收方一直跟我说,我要这个我要这个,你给的不对,哈哈哈哈。 2.2 TCP流量控制? ? ? ? ?如果RcvWindow=0,发送方会持续发送很小的信息,以便返回RcvWindow大小。 2.3 TCP连接管理? ? ? ? ?终于来啦终于来啦,三次握手四次挥手,为了这碗醋包的这盘饺子啊。 2.3.1 三次握手? ? ? ? ?在建立TCP协议的时候,一般来说,客户都是请求发起者,服务端接受请求建立连接。这个过程一般分为3步: ? ? ? ? 1.服务端新建套接字,绑定地址信息后开始监听,进入LISTEN状态。客户端新建套接字绑定地址信息后调用connect,发送连接,即发送一个SYN报文段,并进入SYN_SENT状态,等待服务器的确认。(SYN段是不携带任何的信息的,但是要将SYN标志位要置1,需要传递客户机选择的初始序列号) ? ? ? ? 2.服务端一旦监听到连接请求,就会将连接放入内核等待队列中,如果服务器想要建立连接的话,就会向客户端答复一个SYN+ACK报文段,进入SYN_RCVD状态。此时服务器会为这个连接分配必要的缓冲等资源,并且告知客户端,自己的初始的序列号。 ????????3.客户端收到SYN+ACK报文后向服务端发送确认报文段ACK(此时SYN的标志位就不再置1了),并进入ESTABLISHED状态,开始读写数据。服务端一旦收到客户端的确认报文,就进入ESTABLISHED状态,就可以进行读写数据了。
? ? ? ? ?在第二次握手的时候,服务器会给此次连接分配必要的缓冲等资源,并且等待第三次握手,即客户端发送ACK信息。在这个过程中,服务器会等待一段时间,如果第三次握手发送的ACK信息迟迟不来,服务器就会取消掉这一次连接建立并且释放掉分配的资源。 ? ? ? ? 但是,试想一下,如果段时间内有大量的连接建立请求,并且都在白嫖完服务器分配的资源之后,不发送第三次握手的ACK信息,这时候会发生什么?这就是SYN泛洪攻击,或者说是DDOS分布式拒绝服务攻击。 ?2.3.2 四次挥手? ? ? ? ?TCP协议的关闭,一般来说,分为4步,也就是常说的四次挥手。TCP连接的拆除客户端和服务器都能发起,一般来说是客户端发起。 ? ? ? ? ?1.客户端主动调用close时,向服务端发送结束报文段FIN报文段,同时进入FIN_WAIT1状态; ? ? ? ? 2.服务器收到FIN报文段后,就会回复一个ACK,关闭连接并进入CLOSE_WAIT状态,此时如果服务端有数据要发送的话,客户端依然需要接收。客户端收到服务器对结束报文段的确认ACK,就会进入到FIN_WAIT2状态,开始等待服务器的结束报文段FIN; ? ? ? ? 3.服务器端数据发送完毕后,当服务器真正调用close关闭连接时,会向客户端发送结束报文段FIN包,此时服务器进入LAST_ACK状态,等待客户端最后一个ACK的到来; ? ? ? ? 4.客户端收到服务器的FIN结束报文段,并且回复最后一个ACK(此时会进入等待状态TIME_WAIT,如果持续接受到FIN报文段,就会重新发送ACK);服务器收到了对结束报文段确认的ACK,进入CLOSED状态,断开连接。而客户端要等待2MSL的时间,才会进入到CLOSED状态。 ? ? ? ? 为什么连接时只要3次握手,断开要4次挥手呢,为什么要多一次?
? ? ? ? 整个三次握手,四次挥手的过程中的客户端和服务端的流程就如下图啦! 2.4 TCP拥塞控制原理?2.4.1 拥塞控制成因? ? ? ? 据说可靠传输问题是网络10大问题之一,拥塞控制也是10大问题之一,是网络数据传输中亟需解决的。 ? ? ? ? ?分组丢失问题不是已经在之前的可靠性传输中解决了吗?为什么现在还要解决。我就当兰顺老师的例子啊,相当的形象。可靠性传输解决的丢失,相当于是从我们个人的角度来说的,也就是客户端和服务器之间,而拥塞控制解决的,是整个宏观上的问题,即整个网络上的丢失问题。有个弹幕说的是真好,如果按照可靠性传输定义的那样解决分组丢失问题,那越挤越丢,越丢越发,越发越挤,为了一个客户的理论,把整个网络都给搞死了。 ? ? ? ? ?这还只是考虑了简单的情况,如果考虑到多个路由器之间的传输,那么拥塞问题将很致命。 ?2.4.2 拥塞控制原理?2.4.3 TCP拥塞控制机制? ? ? ? ?拥塞控制在一定程度上造成了公平的问题。 ? |
|
网络协议 最新文章 |
使用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 5:55:42- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |