详解TCP协议

Posted 后端精选

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详解TCP协议相关的知识,希望对你有一定的参考价值。


TCP的应用非常广泛,http/https/ssh都是基于TCP的应用层协议,今天我们详细聊一聊TCP协议,都有哪些特征,还有优缺点。
TCP协议:

TCP协议全称:传输控制协议。

   

源端口号/目的端口号:表示数据从哪个进程来,到哪个进程去。

标志位:

URG:标识紧急指针是否有效

ACK:标识确认序号是否有效

PSH:用来提示接收端应用程序立刻将数据从tcp缓冲区读走

RST:要求重新建立连接,我们把含有RST标识的保温称为复位报文段

SYN:请求建立连接,我们把含有SYN标识的保温称为同步报文段

FIN:通知对端,本端即将关闭,我们把含有FIN标识的报文称为结束报文端

连接管理机制:

tcp需要经过三次握手建立连接,四次挥手断开连接。

三次握手:

刚开始客户端和服务器都处于close状态。
发起连接请求
1.TCP服务器先创建传输控制快TCB,转杯接收客户端的连接请求,此时服务器进入监听状态。
2.TCP客户端进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文,此时报文首部中的同步标志为SYN=1,同时选择一个初始序号seq=x,此时,TCp客户端进程进入SYN-SENT(同步已发送状态)。TCP规定,SYN报文段(SYN=1的)不能携带数据,但需要消耗掉一个序号。
3.TCP服务器收到请求报文后,如果同意连接,则发出确认报文,确认报文中的ACK=1,SYN=1,确认序号是X+1,同时也要为自己初始化一个序号seq=y,此时TCP服务器进入了SYN-recv(铜鼓收到)的状态。这个报文也不能携带数据,但同样需要消耗一个序号。
4.TCP客户端进程收到确认后还要向服务器给出确认,确认报文ACK=1,确认序号是y+1,自己的序列号是x+1.
5.此时,TCP连接建立,双方开始通信。
为什么不是两次:主要是为了防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误,如果使用的是两次握手,假设客户端发送的第一个请求链家而并且没有丢失,只是因为网络中直流时间太长了,由于TCO客户端迟迟没有收到确认报文,一位服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时之前滞留的那一次请求连接因为网络通畅了,到达了服务器,这个报文本应该失效的,但是两次握手的机制会让客户端和服务器再次建立连接,导致不必要的错误和资源浪费,如果采用的三次握手,就算那一次失效的报文传送过来了,服务端接收到那条失效报文,并且回复了确认报文,但是客户端不会再次发出取人。由于服务器收不到确认,就知道客户端没有请求连接。



为什么建立连接是三次握手,关闭连接确是四次挥手呢?

建立连接的时候,服务器在监听状态下,收到建立连接的请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,服务器收到对方的FIN报文时,仅仅标识对方不在发送数据了,但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意关闭连接,因此己方ACK和FIN一般都会分开发送,从而导致多了一次。

如果已经建立了连接,但是客户端突然发故障了怎么办?

TCP设有一个保活计时器,如果客户端出现故障,服务器不能一直等下去,服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75分钟发送一次,若一次发送10个探测报文任然没反应,服务器就认为客户端出了故障,接着关闭连接。

确认应答机制:

TCP将每个字节数据都进行了编号,即序列号。每一个ACK都带有对应的确认序列号,意思是告诉发送者,我已经收到了哪些数据,下一次你要从哪里开始发。

超时重传机制:

A发送数据给B后,可能因为网络拥堵等原因,数据无法到达主机B,如果主机A在一个特定时间间隔内没有收到B发来的确认应答,就会进行重发,但是A没收到确认应答也可能是ACK丢失了。

流量控制:

接收端处理数据的速度是有限的,如果发送端发的太快,导致接收端的缓冲区被填满,这个时候发送端继续发送,就会造成丢包,进而引起丢包重传等一系列连锁反应。因此TCP支持根据接收端的处理能力,来决定发送端的发送速度。这个机制叫做流量控制。

拥塞控制:

TCP的拥塞控制由4个核心算法组成:“慢启动”(Slow Start)、“拥塞避免”(Congestion voidance)、“快速重传 ”(Fast Retransmit)、“快速恢复”(Fast Recovery)。

当建立新的TCP连接时,拥塞窗口(congestion window,cwnd)初始化为一个数据包大小。源端按cwnd大小发送数据,每收到一个ACK确认,cwnd就增加一个数据包发送量。 如果当前cwnd达到慢启动阀值,则试探性的发送一个segment,如果server超时未响应,TCP认为网络能力下降,必须降低慢启动阀值,同时,为了避免形势恶化,干脆采取极端措施,把发送窗口降为1,为什么通常clieng每接收到一个ack,会把cwnd增加一个segment呢?  这是基于“管道”模型(pipe model)的“数据包守恒”的原则(conservation of packets principle),即同一时刻在网络中传输的数据包数量是恒定的,只有当“旧”数据包离开网络后,才能发送“新”数据包进入网络。如果发送方收到一个ACK,则认为已经有一个数据包离开了网络,于是将拥塞窗口加1。如果“数据包守恒”原则能够得到严格遵守,那么网络中将很少会发生拥塞;本质上,拥塞控制的目的就是找到违反该原则的地方并进行修正。

面向字节流:

创建一个TCP的socket,同时在内核中创建一个发送缓冲区和一个接收缓冲区,调用write时,数据会先写入发送缓冲区中,如果发送的字节数太大,会被拆分成多个TCP数据包发出,如果发送的字节数太小,就会先在缓冲区里等待,等缓冲区大小差不多了再发送出去,接收数据的时候,数据也是从网卡驱动程序到达内核接收缓冲区,然后应用程序可以调用read从接收缓冲区拿数据。TCP的一个连接既有发送缓冲区,也有接收缓冲区,既可以读数据,也可以写数据,这个概念叫做全双工。

保证TCP可靠性的机制:

校验和
序列号
确认应答
超时重传
流量控制
拥塞控制



TCP和UDP的优缺点


TCP的优点: 可靠,稳定 TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。

TCP的缺点: 慢,效率低,占用系统资源高,易被攻击 TCP在传递数据之前,要先建连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间,而且要在每台设备上维护所有的传输连接,事实上,每个连接都会占用系统的CPU、内存等硬件资源。 而且,因为TCP有确认机制、三次握手机制,这些也导致TCP容易被人利用,实现DOS、DDOS、CC等攻击。

UDP

UDP的优点: 快,比TCP稍安全 UDP没有TCP的握手、确认、窗口、重传、拥塞控制等机制,UDP是一个无状态的传输协议,所以它在传递数据时非常快。没有TCP的这些机制,UDP较TCP被攻击者利用的漏洞就要少一些。但UDP也是无法避免攻击的,比如:UDP Flood攻击……

UDP的缺点: 不可靠,不稳定 因为UDP没有TCP那些可靠的机制,在数据传递时,如果网络质量不好,就会很容易丢包。

基于上面的优缺点,那么: 什么时候应该使用TCP: 当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。 在日常生活中,常见使用TCP协议的应用如下: 浏览器,用的HTTP FlashFXP,用的FTP Outlook,用的POP、SMTP Putty,用的Telnet、SSH QQ文件传输 ………… 什么时候应该使用UDP: 当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用UDP。 比如,日常生活中,常见使用UDP协议的应用如下: QQ语音 QQ视频 TFTP ……

TCP与UDP区别总结:

2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付


4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信

5、TCP首部开销20字节;UDP的首部开销小,只有8个字节

6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道



以上是关于详解TCP协议的主要内容,如果未能解决你的问题,请参考以下文章

TCP协议---TCP协议详解

TCP协议详解

TCP/IP协议详解

TCP/IP 协议详解

TCP协议详解

TCP协议的超时详解