上一期介绍http 的相关知识点,这期我们深入一点,了解一下TCP(传输协议)的相关内容。
定义
TCP = TRANSMISSION CONTROL PROTOCOL,即传输控制协议。
计算机网路体系结构(OSI七层模型),TCP协议处于第四层,在物理层(线缆、光纤、无线信道等),数据链路层(交换层面segment),网络层(IP)这三个层面之上的一层协议。也就是说,在我们讨论TCP协议的时候,意味着我们的前提是IP可达,ping包(网络诊断工具)可通的情况下。
工作原理
简单的来说就是通过流控制(序列号--确认号机制),使得双方的通信过程是可靠的,同时还有一些性能优化(例如窗口机制)的实现在里面。因为不能把所有的IP协议都当作TCP协议来使用,所以规定,当检测到IP协议中PROTOCOL字段为6时,我们将IP字段后的协议视为TCP协议。
为什么是三次握手,而不是两次或者四次?
这里借用知乎上的一个回答:这个问题的本质是,信道不可靠, 但是通信双方需要就某个问题达成一致。 而要解决这个问题,无论你在消息中包含什么信息, 三次通信是理论上的最小值。所以三次握手不是TCP本身的要求,而是为了满足"在不可靠信道上可靠地传输信息"这一需求所导致的。请注意这里的本质需求,信道不可靠,数据传输要可靠。三次达到了,那后面你想接着握手也好, 发数据也好,跟进行可靠信息传输的需求就没关系了。因此,如果信道是可靠的, 即无论什么时候发出消息,对方一定能收到, 或者你不关心是否要保证对方收到你的消息,那就能像UDP(用户数据报协议)那样直接发送消息就可以了。
下图是比较形象的描述三次握手的流程:
连接的建立和终止
在理解TCP的建立与终止之前,我们先来了解几个概念:
SYN报文表示建 立连接,
FIN报文表示关闭连接,
ACK表示响应。
一个 正常的TCP连接从建立到分开,要完成三次握手四次挥手。首先是建立,如下图:
1、客户端向服务器申请建立TCP连接,向服务器发送一个SYN报文,作为第一次握手。客户端把这段连接的SYN设定为随机数A。
2、服务器端收到SYN报文后,会向客户端发送一个报文。报文中ACK的确认码为A+1,同时发送另一个SYN为随机序号B。
3,此时,客户端收到ACK为A+1的报文,将之与发送的SYN包进行比对,如果满足+1的关系,则在客户端判断连接已建立。并给服务器发送确认数据包,SYN为A+1,表明已收到上一报文,ACk为B+1,通知服务器进入连接状态。
此时,TCP连接已建立完成可以正常的传输数据。再则是连接终结,即四次挥手,如下图:
终结连接操作可由双方任意一方发起。本文以客户端为例。
1、客户端向服务器发送一个FIN报文,作为第一次挥手。通知服务器,我已经没有数据还要发送。但不确认服务器是否仍有数据返回,所以连接仍是建立状态。
2、服务器收到FIN报文,返回一个ACK报文,告诉客户端,我知道你已经没有东西要发送了,但我还要再确认一下我是不是还有东西要给你。
3、服务器判断自己也没有报文需要发送给客户端,发送FIN报文,告诉客户端,好了,这下我也没有东西要给你了,你可以终结连接了。此时服务器不确认客户端是否收到信息,继续保持连接。
4、客户端收到ACK和FIN消息后,得知服务器已经知道自己要终结,并无更新内容,便给服务器发送一个ACK说我知道了,你也终结吧,客户机便终结连接。服务器在收到一条ACK后,也终结连接。
至此,四次挥手结束,连接终结。
以上总结的前端设计与http 和 TCP 相关的基础知识比较粗浅,适合没有一些网络基础初学者阅读,如需要深入了解底层知识,可以上网查阅相关资料或买一些书籍研究。以上总结的内容如有纰漏请多多指正。