Tcp协议细节(三次握手,四次握手)
利用滑动窗口实现流量控制(让发送方的发送速率不要太快,让接收方来得及接收)
(发送窗口的发送窗口不能超过接收方给出的接收窗口的数值)
拥塞控制
拥塞:在某段时间,对网络中某一资源的需求超过了该资源所能提供的可用部分
首先发送方维持一个叫做拥塞窗口cwnd的状态变量,拥塞窗口的大小取决于网络的拥塞程度,并且动态的变化,发送方让自的发送窗口等于拥塞窗口。如果考虑到接收方的接受能力,那么发送窗口还可能小于拥塞窗口。
发送方控制拥塞窗口的原则:只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去,制药网络出现拥塞,拥塞窗口就减小一些,以减小注入到网络中的分组数。
几种解决拥塞控制的方法:慢开始,拥塞避免,快重传,快恢复
慢开始:
当主机开始发送数据时,如果立即把大量数据字节注入到网络中,可能引起网络的负荷情况,经验证明,较好的方式是先探测一下,由小到大逐渐增大发送窗口
举一个例子:
在一开始,发送方先设置cwnd=1,发送第一个报文段M1,接收方收到后确认M1。发送方收到对M1的确认后,把cwnd从1增大到2,于是发送方接着发送M2和M3两个报文段,接收方接收到后发回对M2和M3的确认。此时cwnd从2变化到4,然后发送M4到M7,以后每次都是呈倍数增长。
拥塞避免算法:
让拥塞窗口cwnd缓慢增大,每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,拥塞窗口cwnd是按线性规律缓慢增长,比慢开始算法的拥塞窗口增长速率慢很多。
快重传:
要求接收方每收到一个失序报文立即发送重复确认。以图为例:
解释:
1.当发送方发送M3给接收方,在传送过程中发生丢包,
2.发送方维持的拥塞窗口中的数据包还在传送,而每一次传送到接收方,接收方都发送一个重复确认M2给发送方
3.只要发送方接收到3个重复确认时,不用等到M3设置的超时重传计时器到期,就自动重传M3
快恢复:
1.当发送方连续接收到3个重复确认时,就执行“乘法减小”算法,把慢开始门限减小,为了预防网络发生拥塞,但接下去不执行慢开始算法
2.由于发送方现在认为网络很可能没有发生拥塞(如果网络发生了严重的拥塞,就不会一连有好几个报文段连续到达接收方,也就不会导致接收方连续发送重复确认),故与慢开始不同之处在于现在不执行满开始算法,而是把cwnd值设置为慢开始门限ssthresh减半后的数值,然后开始执行拥塞避免算法,使拥塞窗口缓慢的线性增大
首先tcp的运输连接有3个阶段:连接建立,数据传送,连接释放
三次握手:
主要用于tcp的连接建立阶段,引用《计算机网络第6版》中的图加以说明:
首先,发起请求的一方成为客户端,故上图客户端是A,被动等待连接的一方是服务器端,故为B
分析三次握手过程:
- A首先向B发起请求,此时的SYN(同步,在连接建立时用来同步序号)。当SYN=1,而ACK=0,这是一个连接请求报文段,此时A设置一个随机序列号,向B发起请求
- B收到请求后,向A回复一个SYN=1,ACK=1(确认号为1),表示这是一个同意建立连接的报文段。此时ack必须为seq+1,同时也为自己设置一个seq=y,
- A收到B的确认后,向B发送一个ACK=1,并且将ack设置为y+1,seq(字节编号),Tcp的标准规定,ACK报文可以携带数据,但是如果不携带数据则不消耗序号。
为何A还要发送一次确认,主要是为了防止已经失效的链接请求报文段突然又传到了B,因而产生错误
TCP的连接释放:(4次握手)
- A的应用进程先向其TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接,A把连接释放报文段首部的终止控制位FIN置为1(FIN字段用来释放一个连接),其序号seq=u,它等于前面已传送过的数据的最后一个字节的序号加1
- b收到连接后,发出ACK=1,并ack=u+1,且设置自己的seq=v,此时的tcp处于半关闭状态,a收到确认后,进入等待状态,等待b发出的连接释放报文段
- 若b没有要向a发送的数据,其应用进程就通知TCP释放连接,这是b发出的连接释放报文段必须使FIN=1,并设置自己的seq=w,且b必须重复上次已发送过的确认号ack=u+1,并且设置ACK=1
- a收到b的连接释放报文段后,必须对此发出确认,在确认报文中把ACK置为1,确认号ack=w+1,而自己的序号是seq=u+1
为何A在time-wait状态必须等待2MSL的时间呢?
1,确保a发送的最后一个ack报文段能够到达b
2,防止之前提到的“已失效的连接请求报文段”出现在本连接中
Tcp协议细节(三次握手,四次握手)的更多相关文章
- python摸爬滚打之----tcp协议的三次握手四次挥手
TCP协议的三次握手, 四次挥手 三次握手过程 1, 服务器时刻准备接受客户端进程的连接请求, 此时服务器就进入了LISTEN(监听)状态; 2, 客户端进程然后向服务器发出连接请求报文, 之后客户端 ...
- TCP协议中三次握手
TCP/IP是互联网相关的各类协议族的总称 TCP/IP协议族分为:应用层,传输层,网络层,数据链路层 应用层:向用户提供应用服务时的通讯的活动 传输层:提供处于网络连接中的两台计算机之间的数据传输 ...
- 三报文握手 四报文握手 TCP运输连接管理
三报文握手 四报文握手 TCP运输连接管理
- 计算机网络-TCP之三次握手/四次握手
.概念 .特点 .背景知识补充 .三次握手 .四次握手 .其他补充 1.概念 TCP(Transmission Control Protocol,传输控制协议)是 在不可靠的IP层之上实现的可靠的数据 ...
- TCP协议的三次握手和四次挥手过程
TCP是一种面向连接(连接导向)的.可靠的基于字节流的传输层通信协议.TCP将用户数据打包成报文段,它发送后启动一个定时器,另一端收到的数据进行确认.对失序的数据重新排序.丢弃重复数据. 1.TCP/ ...
- TCP协议的三次握手和四次挥手
暂时需要的信息有: ACK : TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1 SYN(SYNchronization) : 在连接建立时用来同步序号.当SYN= ...
- 网络编程——TCP协议的三次握手和四次挥手
三次握手原理解析 TCP握手协议在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND ...
- TCP协议的三次握手和四次分手
HTTP连接 HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用. ...
- 通俗大白话来理解TCP协议的三次握手和四次断开
from : https://blog.csdn.net/Neo233/article/details/72866230?locationNum=15&fps=1%20HTTP%E6%8F%A ...
- 通俗大白话来理解TCP协议的三次握手和四次分手
通俗理解: 但是为什么一定要进行三次握手来保证连接是双工的呢,一次不行么?两次不行么?我们举一个现实生活中两个人进行语言沟通的例子来模拟三次握手. 引用网上的一些通俗易懂的例子,虽然不太正确,后面会指 ...
随机推荐
- 关于使用format()方法格式化字符串,读这一篇就够了!
从Python 2.6开始,又出现了另外一种格式化字符串的方法——format()方法.format()方法是字符串众多方法中的一个,调用这个方法时要使用点操作符(.),该方法返回一个格式化好的字符串 ...
- 20164310Exp6 信息搜索和漏洞扫描
实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测.具体服务的查点(以自己主机为目标) (4)漏洞扫描:会扫,会看报告, ...
- UHF RFID,高频RFID开发参考资料
ISO18000-6C电子标签百科 http://baike.baidu.com/item/ISO18000-6C%E7%94%B5%E5%AD%90%E6%A0%87%E7%AD%BE/80500 ...
- 使用pgrouting进行最短路径搜索
PgRouting是基于开源空间数据库PostGIS用于网络分析的扩展模块,最初它被称作pgDijkstra,因为它只是利用Dijkstra算法实现最短路径搜索,之后慢慢添加了其他的路径分析算法 ...
- 神经网络常用的Numpy功能笔记
数组初始化 x=np.array([[1,2]]) x=np.zeros((2,3)) 生成随机数 w=np.random.randn(2,3) PIL image转换成array img = np. ...
- Comparator与Comparable,自定义排序和类比较器,TreeSet对象排序
/** * 学生类 * @author Administrator * */ public class Student { private String sno ; private String sn ...
- Python threading(多线程)
threading模块在较低级别thread模块之上构建更高级别的线程接口. 一.threading模块定义了以下函数和对象: threading.active_count() 等同于threadin ...
- react基础学习 二——生命周期
生命周期mount: mounting装载创建 update更新 unmounting卸载 错误捕获 注意点:生命周期函数的 作用,什么之后用 只有类式组件有生命周期,函数式组件没有生命周期 moun ...
- OSS RFC
This is a very late reply, but just want to share the process of setting up all associated RFCs with ...
- Mysql将查询结果合并为一列
利用函数:group_concat(),实现一个ID对应多个名称时,原本为多行数据,把名称合并成一行. 完整的语法如下: group_concat([DISTINCT] 要连接的字段 [Order B ...