TCP三大特性
众所周知TCP协议的特点:面向连接,可靠传输,面向字节流,接下来,我们便一一对这些特性做一个详细的讲解
一、TCP三大特性之面向连接
面向连接重点:三次握手建立连接,四次挥手断开连接
1.1 三次握手建立连接
如下图所示,客户端和服务端在建立连接前都要进行三个步骤(图中红色文字的介绍,三次握手在后面):
对上图中的标数字的步骤进行详细讲解
(1)客户端发送链接请求,并且封装报头,将报头中的SYN置为1,服务端收到请求,并且新建了一个套接字,即new socket,进入一个新的状态叫做SYN-RCVD
(2)服务端收到请求,给出一个确认回复SYN+ACK ,客户端收到这个信息后,进入EATABLISHED状态,认为服务端具有数据收发能力,他也给服务端回复一个确认ACK
(3)客户端收到服务端的信息后,给服务端回复一个确认ACK,服务端收到ACK后也进入一个ESTABLISHED状态,认为客户端也具有数据收发能力,那接下来双方就可以收发数据了。
为什么需要三次握手,而不是两次?
大家应该都纠结过这个问题,因为TCP是一个双工通信,需要都确定对方具有数据收发能力,都得给对方发送数据连接请求,等待对方回复,那这里你也许会问,客户端发送一个连接请求,服务端收到后进行回复确认并发送一个连接请求,不就只有两次吗,要三次不多余吗?那你有没有想过万一服务端给客户端的确认信息丢失了怎么办?客户端还在傻傻等着回复信息,他也不知道自己的请求人家收到了没,也不知道起始序号,也不知道数据如何发送,只能等着。所以,两次不够,三次才是最合适的。
1.2 四次挥手断开连接**
当数据发送完完毕,自然是要断开连接,如下图所示:
对以上标数字的过程的解释:
(1)客户端调用close接口,给对方发送一个FIN包,自己进入FIN_WAIT1状态,表示自己不再向服务端发送数据了
(2)服务端收到请求后,给客户端发送一个确认ACK,表示自己收到客户端不再发送数据的请求。服务端进入一个状态叫做CLOSE_WAIT状态,客户端进入FIN_WAIT2状态。
(3)服务端给客户端发送一个连接断开的请求,即就是FIN包,调用close接口,进入LAST_ACK 状态
(4)客户端收到FIN包,发送完确认ACK后,进入TIME_WAIT状态,服务端收到ACK后进入CLOSED,立即销毁资源
为什么挥手是四次?
有可能被动关闭方还有数据要发送,像是客户端发送连接断开请求并发送FIN包,但是并不表示他不接收数据,而服务端对发来的FIN包进行回复,但可能他还有数据要发送,只有等用户确认数据发送完毕了,关闭了套接字,服务端才能发送FIN包来断开连接。即就是ACK和FIN包是分别进行发送的,而不是跟三次握手一样放在一起发送的,因此挥手必须是四次,懂了吗?
TIME_WAIT的作用是什么?
假设一下并没有TIME_WAIT,那主动关闭方套接字会直接被释放,直接进入CLOSED状态,如下图所示,如果最后一次的ACK丢失,那服务端会重新发送FIN包,那就会对客户端的新连接造成影响(比如其他服务器会给他发送SYN连接请求),因此会等待两个MSL的时间,也就是重传的FIN包和回复ACK的时间
连接管理中的保活机制是指什么?
看到这里,我们可能会有疑问为什么需要保活?不要可不可以?因为TCP可是面向连接的,只有通信双方相互建立了连接,才能够通信,若很长时间双方都没有通信,我们也很难保证双方是否在线,因此TCP就会默认一个保活机制,来探测连接是否健全。
所以保活机制就是:
- 若通信双方长时间(7200s)无数据往来,则服务端每隔一段(75s)时间就会向客户端发送一个保活探测数据包,要求对方回复。
- 若多次(9次)都没有得到相应,则认为连接断开
- 反应就是recv返回0,send触发一个SIGPIPE异常
二、TCP三大特性之可靠传输
2.1 避免丢包
TCP为了避免丢包,其实采用两种机制,一种是滑动窗口机制,另一种是拥塞控制机制
2.1.1滑动窗口
首先来说下滑动窗口机制:滑动窗口是类似于一个窗口一样的东西,用来告诉发送端可以发送数据的大小或者说是窗口标记了接收端缓冲区的大小
接收端一旦发现自己的缓冲区快满了,就会将窗口大小设置成一个更小的值通知给发送端,发送端接收到这个值后,就会减慢自己的发送速度。
如果接收端发现自己的缓冲区满了,就会将窗口的大小设置成0,此时发送端将不再发送数据,但是需要定期的发送一个窗口探测数据端,使得接收端吧窗口大小告诉发送端。(小声说一句,在TCP首部,有一个16位窗口字段,此字段就是用来存放窗口大小信息的)
滑动窗口机制里面有三种协议:
停等协议
当发送窗口和接收窗口的大小固定为1是,滑动窗口协议退化为停等协议,该协议规定发送方没发送一个帧就要停下来,等待接收方以正确接收的确认返回后才继续发送下一帧。
由于停等协议规定只有一帧完全发送成功后才能发送新的帧,因此只用一个比特来编号就够了。
缺点:大大降低信道的利用率
后退n步(GBN)
发送方在发完一个数据帧之后,不停下来等待应答帧,而是连续发送若干个数据帧,即使在连续发送过程中收到了对方的应答帧,也可以继续发送。发送方没法玩一个数据帧都要设置超时计时器,如果在规定时间内没有收到确认帧,就要重发相应的数据帧。
不难看出,后退n协议一方面因连续发送数据帧提高效率,另一方面,在崇川上又必须把原来已经正确传送过的数据帧进行重传(仅仅因为这些数据帧之前有一个数据帧出了错),这种做法使得传送效率降低。
选择重传
在后退n步协议里,接收方若发现错误帧就不在接收后续的帧,即使是正确到达的帧,这显然是一种浪费。所以选择重传协议当发现出现错误帧之后,将后续正确的帧放入缓冲区中,同时要求发送方重新传送出错的那一个帧。一旦收到重新传来正确的帧后,就可以把原来存在缓冲区的其余帧按照正确的顺序递交高层。
选择重传减少了浪费。
2.1.2 拥塞控制
拥塞控制就是防止过多的数据注入网络,这样可以使得网络中的路由器或者链路不至过载。拥塞控制是一个全局性的过程,它作用的对象是网络
拥塞控制使用慢启动快增长的方式,实现网络探测避免因为网络不好而导致丢包。这里我贴一个其他博主的链接拥塞控制,里面详细的说明了慢启动快增长的过程。
2.2 提高性能
快速重传机制
当发送方收到三个或者三个以上的冗余ACK之后,就意识到之前发的报文可能丢了,于是快速重传它,为什么是三个或者三个以上,请看下图:
如图,报文段1成功接收并被确认ACK2,接收端的期待序号为2,当报文段2丢失,报文段3失序到来,与接收端的期望不匹配,接收端重复发送冗余ACK2.
延迟应答机制
数据传输的时候,发送端给接收端发送数据,接收端给发送端发去确认应答信息,这样比较耗时,效率低下,延迟应答就是接收端收到数据后,稍微等会儿在应答,这样可以提高数据传输效率,因为发送端发好几次数据,接收端只需要一次来确认应答,这样可以降低网络拥塞的概率。
捎带应答机制
虽然有延迟应答,但是客户端和服务端在应用层还是“一发一收”,此时酒水导致数据传输效率低下。
捎带应答就是在接收端给发送端发送数据的时候,捎带着向发送端发去确认应答,应答的内容是接收端已经收到发送端发送的数据。
三、TCP三大特性之面向字节流
先记住这几个字眼:
面向字节流:传输单元以字节为单位灵活传输
缺点: 面向字节流服务比较可靠,但是会出现黏包问题。
3.1 什么是TCP的黏包?
TCP在传输层对数据边界并不敏感,(并不管什么类型的数据或者多少数据,只管发送合适大小的数据)导致多条数据合成一条数据进行处理,黏包在接收方和发送方都有可能发生
3.2 如何解决黏包?
需要用户在应用层进行一个数据边界的管理
(1)数据定长:规定数据的长度
(2)特殊字符进行间隔
(3)在不定长数据的应用层头部中添加数据长度字段:接收方根据头部长度,接收该长度的数据
以上就是关于TCP三大特性的所有内容,有问题的话希望广大读者给与建议,一定虚心采纳