| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 网络协议基础07--传输层 -> 正文阅读 |
|
[网络协议]网络协议基础07--传输层 |
面试可能会问到:什么是TCP的可靠传输/流量控制/拥塞控制/建立连接释放连接? 传输层有2个协议:UDP用户数据报协议和TCP传输控制协议 TCP应用层协议:HTTP、HTTPS、FTP、SMTP、DNS(表示应用层要是用的是HTTP协议的话,传输层必然用的是TCP协议) UDP应用层协议:DNS UDPUDP首部中,端口号占16位,客户端的源端口是临时开启的随机端口
?TCP? 标志位:URG(当URG为1时,紧急指针字段才有效);ACK(ACK为1时,确认号字段才有效) ??????????????? PSH(……);RST(当RST为1时,表明连接中出现严重差错,必须释放连接再重连) ??????????????? SYN(当SYN=1,ACK=0时表示这是一个建立连接的请求,若对方同一建立连接回复SYN=1,ACK=1) ??????????????? FIN(当FIN=1,表示数据已发送完毕,要求释放连接) 序号:在建立连接后,这一次给对方的TCP数据部分的第一个字节的编号 确认号:建立连接后,期望对方下一次传过来的TCP数据部分的第一个字节的编号 窗口:有流量控制的功能,告知对方,下一次允许发送的数据大小 TCP的几个要点: ·可靠传输:保证服务器给客户端返回数据时,如果有包丢失了,会补发 ·流量控制:告诉服务器我窗口大小,不要发太多太快 ·拥塞控制:在流量控制的基础上,再进一步一起维护网络 ·连接管理:三次握手,四次挥手 TCP--可靠传输·停止等待ARQ自动重传请求(每发完一组数据,停止发送,等待对方确认后再发下一组) ·连续ARQ+滑动窗口(发送窗口中的连续分组,发送完之后,停止发送,等待确认) ·SACK选择性确认:TCP只发送丢失的包,已经收到的包会放在TCP头部的可选部分 思考:为什么在传输层就要把数据分成多个段传输,而不是等到在网路层分片传给数据链路层? 因为:可靠传输是在传输层进行控制的,网络层和数据链路层是没有可靠传输功能的,若不在传输层就分成一个一个的段,一旦数据丢失,整个传输层的数据都得重传。 TCP--流量控制(点对点)什么是流量控制? 让发送方的发送速率不要太快,让接收方来得及处理、 为什么要进行流量控制? 如果接收方的缓存区满了,发送方还在疯狂发数据,接收方只能把收不下的数据包丢掉,大量的丢包会极大地浪费网络资源 TCP--拥塞控制(全局性)作用:防止过多的数据注入到网络中,避免网络中的路由器过载 方法: ·慢开始:cwnd初值很小,随着接收方的确认,成倍增长 ·拥塞避免:设置一个ssthred慢开始阈值,慢开始一段时间后,达到ssthred,以线性方式增加cwnd,当出现网络拥塞时,把拥塞峰值的一半作为ssthread, ·快速重传:接收方只要接收到了一个失序的分组就给发送方发确认,发送方只要收到连续3个确认,就立刻重传丢失的报文 ·快速恢复:出现拥塞控制后,不是从慢开始最初的cwnd开始,而是把cwnd设为新的ssthread,然后用拥塞避免线性增大 MSS:每个段最多能传多少字节(建立连接是在TCP头部可选部分表明,双方择其最小值) rwnd:接收窗口 cwnd:拥塞窗口 swnd:发送窗口 swnd=min(rwnd,cwnd) 当rwnd<cwnd,是接收方的接受能力限制发送窗口的最大值 cwnd<rwnd是网络的拥塞限制 TCP--建立连接-3次握手?在Windows上可以用netstat -ant -p TCP查看TCP状态,基本上只能看到Listen和Established CLOSED:客户端处于关闭状态 SYN-SENT:客户端已经向服务端发起请求建立连接的报文,等待Server回复 LISTEN:服务端处于监听状态 SYN-RCVD:服务端收到了客户端发来的连接请求,返回给客户端ACK,等待客户端最终确认 ESTABLISHED:请求已经成功建立 前2次握手,TCP头部会放一些双方交换确认的信息,如MSS,窗口等,是否支持SACK 为什么要建立3次握手?2次不行吗? 建立3次握手的主要目的:为了防止已失效的连接请求报文段突然又传送到了服务端,防止Server端一直等待,浪费资源,产生错误。 TCP--建立连接-释放连接-4次挥手?Client和Server谁想先发起断开连接都行。这里我们假设的是Client想先断开 FIN-WAIT-1:Client给Server发送了FIN报文,进入终止等待1。 FIN-WAIT-2:当收到了对方的ACK后,进入终止等待2。 CLOSE-WAIT:收到对方断开连接的请求就进入关闭等待状态,并回应对方一个ACK表示我收到了 LAST-ACK:被关闭一方发送FIN后进入最后确认状态,等待对方最后的ACK,收到后就可以进入CLOSED了 TIME-WAIT:收到了对方的FIN,并发送ACK报文,等2MSL后就可以进入CLOSED状态 有时候抓包工具会显示,第2、3次挥手合并了(表示我知道你没数据发了,同时我也没数据发了) MSL:最大分段生存期,是指TCP报文在因特网上的最大生存时间,一般是2分钟。 为什么要等2MSL后再断开?即 TIME - WAIT 状态的作用是什么? ?------1.可以防止本次连接中产生的数据包误传到下一次连接中(因为客户端的端口是随机的,可能存在上一次连接的端口和下一次的端口刚好是一个的情况,设置为2MSL可以避免误传)。 -------2.为了保证客户端发送的最后1个连接释放确认报文 能到达服务器,从而使得服务器能正常释放连接 (客户端的第四次挥手可能丢失,如果立马关闭连接,服务器收不到客户端的最后一个释放报文会重发,此时客户端已经关闭了,会导致服务端连接关闭不了。 为什么要进行4次挥手? 因为TCP是全双工模式,释放连接后,双方都无法都无法接收 / 发送消息给对方。——第1次挥手:主机1告诉主机2,主机1已经没有数据要发给主机2了,但是主机1依然可以接收主机2发送来的数据。第2次挥手:表示主机2知道主机1没有数据要发了,但是主机2还是可以给主机1发的。第3次挥手:表示主机2告诉主机1,主机2已经没有数据要发给主机1了。第4次挥手:表示主机1知道主机2没有数据要发了,随后断开整个连接。 |
|
网络协议 最新文章 |
使用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 12:25:10- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |