1.是什么
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。 在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能。
2.为什么学习他
我们的生活无不无时无刻的站在TCP协议这个“巨人”的肩膀上,最简单的一个打开手机的动作,当你打开浏览器去浏览网站的时候,都是需要建立TCP连接,用来进行数据传输的,当然还是为了让自己对技术有一个更加深入的了解,毕竟万丈高楼平地起嘛。当然面试的时候也经常问到,也是为了高薪哈。(本文也会为大家总结常见的面试题,如果您关心面试,也可以直接从面试问题开始看)
tcp的讲解
虽然TCP是一种计算机网络协议,但本质还是人与人之间的一种约定,只不过由计算机去执行而已,把协议的细节与作用解耦,让我们人类只需专注于基于它的应用呈现之上即可。协议即“规则”,如果我们把光纤“横斜面”剖析,我们看到的就是数据的本质0和1,如下图所示:
0和1是点对点之间通信的信息“载体”,我们需要有一个规则去翻译这些“载体”,好比如发电报,他们约定一个通信密码本进行数据的传输。这些“数据”跟光纤上的“0”和“1”都是承载着一样的任务——信息载体。
要想搞明白TCP协议,我们已经知道他是传输层的协议了,那么我们主要搞明白,TCP的客户端和服务端传输报文的过程和规范,就能把TCP搞明白了。那我们开始,看看TCP的报文和传输流程吧
报文:
源端口号:我们都知道IP是跟主机相关,而每台主机又可以有不同的应用进程在运行,所以端口更多可以指运行在主机上的应用进程,所以源端口号也就是基于TCP协议传输数据的“发送方”。目的端口:就是等待TCP协议发送方数据的“接收方”,其实所谓的端口也就是应用进程与应用进程之间通信的监听出入口。序列号:这个数字是用来表示通信双方“单向”数据量流动数量表示,上面所介绍的0和1是最小的数据传输单元,我们称为“比特(bit)”。而这个序列号记录的是以“字节”为单位的计数器(1字节=8比特)。例如A要传输给B的512字节数据,假设初始序列号为1024(注意:每次初始化序号都会不一样,TCP有一个比较复杂的初始化算法),那么他们传输过程的序列号为1536。这个序列号会随着双方“交流”而不断的增加,因为序列号一共32比特,所以最大值也就是2^32-1,到达最大值后重新从0开始。因为TCP是一个可靠的协议,序列号的存在是其可靠的关键因素之一。ACK:该位为1时说明确认字段是有效,反之为0。SYN:是一个同步序号,通常与ACK合用用来建立连接。例如SYN=1,ACK=0表示连接请求;SYN=1,ACK=1则表示同意建立连接 其他的部分大家也可以百度搜索到就不说了。
传输:三次握手,四次挥手
咱们前面说TCP是可靠的传输层协议,其实就是因为他的三次握手和四次挥手的数据确定机制。三次握手建立连接第一次握手:发送方首先发起TCP建立连接的请求,SYN=1,ACK=0,seq=x,此时发送方进入并进入SYN_SEND状态,等待服务器确认; 第二次握手:接收端收到SYN,同意建立连接,SYN=1,ACK=1,ack=x+1(对发送方回应的确认字段),seq=y,此时接收端进入此时服务器进入SYN_RECV状态; 第三次握手:发送方收到服务器端发来的同意建立连接的分段,如果此时确认真的要建立连接,则向服务器端发送确认字段,ACK=1,ack=y+1(对接收端做出的回应)。发送方和接收方进入ESTABLISHED状态,完成三次握手 四次挥手解除连接在上面提到了TCP的三次握手建立连接,那仫如何拆除连接呢?就是四次挥手拆除连接。因为TCP的连接时全双工的,所以拆除连接需要拆除两个单向的连接。 第一次挥手:当发送方的主机已经发送完毕的时候,在等待接收端的确认的同时,可以向另一端发送拆除连接的请求。FIN=1,ACK=1,seq=u;(客户端连接解除) 第二次挥手:当接收端已经正确接受发送端的所有数据包,会发送一个ACK应答,同时通知本地相应的应用程序;如果此时对方要求关闭连接,此时再发送一个ACK的分段进行确认。ACK=1,FIN=0,ack=u+1;(服务端连接解除) 第三次挥手:因为TCP的连接时全双工的所以也需要拆除接收方到发送方的连接,此时接收端发送一个FIN的报文段。FIN=1,ACK=1,seq=w;(通信连接解除) 第四次挥手:发送方收到这个FIN字段,发回一个ACK应答。ACK=1,FIN=0,seq=u+1,ack=w+1;(解除确定完毕)
4.面试常见问题
1.TCP和UDP的区别
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接 2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠 3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的UDP没有拥塞控制。所以在效率上UDP的传输效率比TCP高 4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
2.为什么TCP需要3次握手建立连接,而不是2次,4次以及n次
其实就是为了保证可靠的通信假设一下如果是两次握手建立连接会发生什仫情况呢?两次握手说明只有请求和应答,假如发送方给接收方发送了一个建立连接的请求,接收方收到了并给发送方做出了ACK应答,然而此时网络不太好,这个应答在回复的路上出了发生了阻塞,延迟了。发送方长时间未收到接收方的回应,认为建立连接失败(但是此时接收方认为连接已经建立好了),于是发送方重新给接收方发送建立连接的请求,此时延迟的ACK应答到达了发送方就会造成网络更加阻塞。而三次握手正好避免了这个问题,如果接收方的ACK应答发生延迟现象,因为是3次握手所以发送方认为自己还没有给接收方发送确认建立连接的字段,所以并不认为连接建立失败,不会重发建立连接的请求;至于为什仫不是4次,以及n次,既然3次握手已经可以成功了建立连接又为什仫要多此一举呢
3.为什么TCP的挥手需要四次
TCP是全双工的连接,必须两端同时关闭连接,连接才算真正关闭。 如果一方已经准备关闭写,但是它还可以读另一方发送的数据。发送给FIN结束报文给对方对方收到后,回复ACK报文。当这方也已经写完了准备关闭,发送FIN报文,对方回复ACK。两端都关闭,TCP连接正常关闭
4.什么是SYN洪水攻击(面试问的不多)
SYN洪水攻击属于DOS攻击的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源。