| |
|
开发:
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知识汇总 |
一、UDP与TCP的对比:TCP是面向连接的,安全可靠,面向字节流,传输效率低,传输速度慢,是一个全双工性,具有流量控制(滑动窗口)、拥塞控制(慢开始、拥塞避免、快重传、快恢复)。发送数据需要与目标主机建立连接。 UDP:面向无连接的,具有不可靠性,是面向报文,传输效率快,传输速率快,属于一对一、一对多、多对一、多对多,无流量控制、拥塞控制。发送数据不需要建立连接。 UDP报文: TCP报文信息: 1、源端口和目的端口,各占2个字节,分别写入源端口和目的端口。 2、32位序号,主要作用就是对数据排序,解决数据的乱序问题。 3、32位确认号,是期望收到对方下一个报文段的的哥数据字节的序号 4、数据偏移,占4位,这个字段实际上指出tcp报文段的首部长度 5、保留 占6位,保留为今后使用,但目前应置为0 6、紧急URG(UGGent)当URG为1时,表明紧急指针字段有效,告诉系统此报文段中有紧急数据,应尽快发送。而不能按原来的排队顺序来传送。当URG置为1时,发送应用进程就告诉发送发的TCP有紧急数据要传送。于是发送发TCP就把紧急数据插入到报文段数据的最前面,而在紧急数据后面的数据仍然时普通数据。这是要与首部中紧急指针字段配合使用。 7、确认ACK,仅当ACK=1时确认号字段才有效,当ACK=0时,确实号无效。TCP规定,在连接建立后所有的传送的报文段都必然把ACK置为1 8、推送PSH,当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应。在这种情况下,TCP就可以使用推送操作。这时,发送发TCP把PSH置为1,并立即创建一个报文段发送出去。接受方TCP收到PSH为1的报文段,就尽快地交付接收应用进程,而不用在等到整个缓存都填满了再向上交付。 9、复位RST,当RST=1时,表名TCP连接中出现了严重错误,必须释放连接,然后再重新建立传输连接。RST置为1还用来拒绝一个非法的报文段或拒绝打开一个连接。 10、同步SYN 在连接建立时用来同步序号,当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则响应的报文段中使SYN=1和 ACK=1,因此syn置为1就表示这是一个连接请求或连接接收报文。 11、终止 FIN 用来释放连接。当FIN=1时,表明此报文段的发送发的数据已经完毕,并要去释放运输连接。 12、窗口 2个字节?? 窗口指的是发送本报文段的一方的接受窗口。窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量,之所以有这个限制,是因为接收方的数据缓存空间是有限的。总之,窗口值作为接收方让发送发设置其发送窗口的依据。 13、检验和 占2个字节 检验和字段检验的范围包括首部和数据这两部分。和UDP用户数据报文一样,在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。伪首部格式和UDP用户数据报的伪首部一样。但应把伪首部第四个字段中的17改为6(TCP的协议号为6);把第五字段中的UDP中的长度改为TCP长度,接收方收到此报文段后,仍要加上这个伪首部来计算检验和,若使用IP v6,则相应的伪首部也要改变。 14、紧急指针 占2个字节 紧急指针尽在URG=1才有意义,他指出本报文段中的紧急数据得分字节数(紧急数据结束后就是普通数据)因此,在紧急指针指出了紧急数据的末尾在报文段中的位置。当所有的紧急数据处理完,TCP就告诉应用程序恢复到正常操作。窗口为0也可以发送紧急数据 15、选项 长度可变 最长可达4字节。 二、TCP三次握手和四次挥手:2.1、 ?第一次握手:客户端将TCP报文标识位SYN置为1,随机产生一个序号值为seq=x,保存在TCP首部的序列号字段里,指明客户端打算连接的服务器的端口,并将该数据包发送给服务端,发送完毕后,客户端进入SYN_SENT状态,等待服务器端确认。 第二次握手:服务器端收到数据包后由标识位SYN=1知道客户端请求建立连接,服务器端将TCP报文标识位SYN和ACK都置为1,ack=x+1,随机产生一个序号值seq=y,并将数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态。 第三次握手:客户机收到确认后,检查ack是否为x+1,ACK是否为1,如果正确则将标识位ACK置为1,ack=y+1,将该数据包发送给服务端,服务端检查ack是否为y+1,ACK是否为1,如果正确则建立成功,客户端和服务器端进入ESTABLISHED状态,完成三次握手。 注:ack代表头部的确认号,是对上一个包的序号进行确认的号,ack=seq+1。 大ACK 则是TCP首部的标识位,用于标识TCP包是否对上一个包进行了确认,如果确认,则把ACK标识位置为1. 2.2、四次挥手: ?第一次挥手:客户机主动调用close报文,向服务器发送一个FIIN终止报文,FIN报文置为1,并产生一个随机数u; 第二次挥手:服务端收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1,服务端进入Close_wait状态。此时TCP连接处于半关闭状态,即客户端已经没有要发送的数据了,但服务端若发送数据,则客户端仍要接受 第三次挥手:服务端发送一个FIN,用来关闭服务端到客户端的数据传送,服务端进入Last_ack状态 三、TCP三次握手和四次挥手的扩展:1、为什么TCP要三次握手,而不是两次或者四次呢?为了防止已失效的连接请求报文段又传送到了B。如果没有第三次握手,那么这样会导致B发出确认后就认为连接已建立,并等待数据到来,造成资源的浪费。 完全可靠的通信协议是不存在的。三次握手之后,通信双方都确认可以进行通信,再增加握手次数也不能保证之后的通信完全可靠,所以没有必要再握手。 2、Server 端收到 Client 端的 SYN 后,为什么还要传回 SYN为了告诉客户端,服务端接收到的确实就是客户端所发送的连接请求报文段。 3、传回了SYN,为什么还要传ACK双方通信无误必须是两者互相发送信息都无误。传了SYN,证明发送方到接收方的通道没问题,而接收方到发送方的通道还需要ACK来进行验证 4、为什么TCP挥手需要四次?主要原因是当服务端收到客户端的FIN数据包后,服务端可能还有数据没发完,不会立即close 所以服务端先将ACK发过去告诉客户端我收到你的断开请求了,但请再给我一点时间,这段时间用来发送剩下的数据报文,发完之后再将FIN包发送给客户端表示现在可以断了。之后客户端需要收到FIN包后发送ACK确认断开信息给服务端。 5、为什么四次挥手释放连接时需要等待2MSLMSL即报文最大生存时间。设置2MSL可以保证上一次连接的报文已经在网络中消失,不会出现与新TCP连接报文冲突的情况。 6、TCP滑动窗口与流量控制机制?滑动窗口:一次连接,发送多个数据,数据量的大小由窗口值限定,窗口的大小就是在无需等待确认包的情况下,发送端能打送的最大数据量。这个机制的实现就是使用了大量的缓冲区,通过对最后一个传输完成的数据进行确认应答这一部分数据的整体确认。传输过程双方都会携带窗口值,通过窗口值的比对可以确认数据传输的完整性。如果匹配,会扩大窗口值,若不匹配则减小窗口值,由于网络传输速率不恒定,所以窗口值不恒定。 7、TCP流量控制与拥塞控制机制?流量控制:指的是,让发送方发送的速率不要太快,让接收方来得及接受。假如接收方来不及接收数据,那么就会分组丢失。在TCP中利用可变长的滑动窗口机制可以很方便的在TCP连接上实现发送方的流量控制。主要方式是接收方返回的ACK中包含自己的接收窗口大小,以控制发送方的发送的数据量大小。 拥塞控制机制:在网络通信中,不仅仅是发送方和接收方,中间还伴有路由器、交换机等网络传输线路,此时需要拥塞控制。他作用于网络的,防止过多的数据注入到网络中,避免出现网络 负荷过大。解决方式:慢开始和拥塞避免、快重传和快恢复。 8、TCP是如何保证数据传输的可靠性?1.校验和,校验和需一致才能传输成功。 2.确认应答和序列号。TCP传输的过程中,每次接收到数据后需要对传输方进行确认应答。TCP对传输过程中的每个数据都进行了编号,确保了传输的可靠性。 3.超时重传:当报文发出后在一定的时间内未收到接收方的确认,发送方就会进行重传 4.连接管理:通过三次握手和四次挥手来确保连接的可靠性。 5.流量控制:TCP支持根据接收端的处理能力,来决定发送端的发送速度 6.拥塞控制:TCP引入慢启动机制,先发出少量数据,就像探路一样,先摸清当前的网络拥堵状态后,再决定按照多大的速度传送数据。 9、谈谈TCP的局限性:TCP的传输速率慢,占用资源高,容易被攻击,本身建立连续,并且发送数据都需要进行确认,消耗时间,在传输数据的时候,有重传机制,确认机制,拥塞控制和控制机制都消耗大量的时间并且需要在每台设备上都要维护到所有的连接,每一次的连接都会占用CPU资源,内存等硬件资源。TCP的确认机制也导致在建立的过程中收到攻击,DDOS DOS攻击。 ……学到后面内容,觉得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图书馆 购物 三丰科技 阅读网 日历 万年历 2025年3日历 | -2025/3/4 7:29:34- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |