赞
踩
TCP协议是一个安全的、面向连接的、流式传输协议,所谓的面向连接就是三次握手,对于程序猿来说只需要在客户端调用connect()函数,三次握手就自动进行了。先通过下图看一下TCP协议的格式,然后再介绍三次握手的具体流程。
在Tcp协议中,比较重要的字段有:
Tcp连接是双向连接,客户端和服务器需要分别向对方发送连接请求,并且建立连接,三次握手成功之后,二者之间的双向连接也就成功建立了。如果要保证三次握手顺利完成,必须要满足以下条件:
三次握手具体过程如下:
第一次握手:
第二次握手:
1.回复ACK, 将tcp协议ACK对应的标志位设置为1,表示同意了客户端建立连接的请求
2.回复了 ack=x+1, 这是确认序号
3.将tcp协议中的SYN对应的标志位设置为 1, 服务器向客户端发起了连接请求
4.服务器端生成了一个随机序号 y, 发送给了客户端
第三次握手:
1.将tcp协议中ACK标志位设置为1,表示同意了服务器的连接请求
2.给服务器回复了一个确认序号 ack = y+1
3.发送给服务器的序号就是上一次从服务器端收的确认序号因此 seq = x+1
四次挥手是断开连接的过程,需要双向断开,关于由哪一端先断开连接是没有要求的。通信的两端如果想要断开连接就需要调用close()函数,当两端都调用了该函数,四次挥手也就完成了。
进行了两次单向断开,双向断开就完成了,每进行一次单向断开,就会完成两次挥手的动作。
第二次挥手:
第三次挥手:
第四次挥手:
流量控制可以让发送端根据接收端的实际接受能力控制发送的数据量。它的具体操作是,接收端主机向发送端主机通知自己可以接收数据的大小,于是发送端会发送不会超过该大小的数据,该限制大小即为窗口大小,即窗口大小由接收端主机决定。
TCP 首部中,专门有一个字段来通知窗口大小,接收主机将自己可以接收的缓冲区大小放在该字段中通知发送端。当接收端的缓冲区面临数据溢出时,窗口大小的值也是随之改变,设置为一个更小的值通知发送端,从而控制数据的发送量,这样达到流量的控制。这个控制流程的窗口也可以称作滑动窗口。
这个图是一个单向的数据发送:
左侧是数据发送端:对应的是发送端的写缓冲区(内存),通过一个环形队列进行数据管理
右侧是数据接收端:对应的是接收端的读缓冲区,存储发送端发送过来的数据
基于TCP通信的流程图,记录了从三次握手 -> 数据通信 -> 四次挥手是全过程:
- # fast sender: 客户端
- # slow recerver: 服务器
- # win: 滑动窗口大小
- # mss: maximum segment size, 单条数据的最大长度
第1步:第一次握手,发送连接请求SYN到服务器端
第2步:第二次握手
第3步: 第三次握手
第4~9步: 客户端给服务器发送数据
第10步:
第11步:win4096表示滑动窗口变为4k,代表还可以接收4k数据,还有2k在缓存中
第12步:客户端又给服务器发送了1k数据
第13步: 第一次挥手,FIN表示客户端主动和服务器断开连接,并且发送了1k数据到服务器端
第14步: 第二次挥手,回复ACK, 同意断开连接
第15, 16步: 服务器端从读缓冲区中读数据, 第16步数据读完, 滑动窗口变成最大的6k
第17步:
第18步: 第四次挥手
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。