本文主要介绍tcp相关概念。主要包括:OSI模型,tcp协议创建和结束流程(三次握手四次挥手),tcp状态变更。
前置知识
常见的web服务的模式(C/S架构)如下图所示
client和server之间的交互是通过消息为媒介进行的,并且这种消息形式一定是C/S两端所约定好的。
而对于当前的互联网世界来说,存在着太多不同的Client和Server端。如何能做到更好的兼容性和扩展性呢,于是就引入了协议(TCP/IP协议等)的概念。协议里约定了相关的规范,只要遵循该协议,两端就可以进行信息交互。
OSI模型
tcp协议模型有两种方式(七层和四层),实质上两者是对同一种协议规范的不同分层描述。
以四层模型引自来描述,如下:
-
应用层
- 应用层:为用户的应用提供服务并支持网络访问。
- 表示层:负责管理网络中计算之间的通信,提供传输层不具备的连接相关功能。
- 会话层:负责转化数据格式,并处理数据加密和数据压缩。
-
传输层
- 提供应用程序接口,为网络应用程序提供网络访问的途径;
- 提供可以从多个应用层序接收消息的功能(多路复用),同时也提供可以把消息分发给应用程序的功能(多路分解)。
- 对数据进行错误检测、流量控制。
- TCP/UDP
- TCP
- TCP面向连接,需要进行三次握手建立连接,四次挥手断开连接。
- 面向流的处理,可以一个个字节的方式接收数据,然后把这些数据组成数据段,发给网际层。
- 对数据发送进行流量控制(滑动窗口协议),避免发送和接收方因为缓存写满而造成的数据丢失问题。
- 对数据进行校验、分段的数据有重新排序功能,对错误和丢失的数据有重发机制。
- UDP
- UDP不面向连接。
- 只有有限的错误检验机制
- 不进行流量控制
- 比较TCP和UDP
- 因为TCP要进行额外的握手、挥手、数据检验、排序机制,所以TCP的性能要比UDP要慢,但是相较UDP,TCP已经做了比较完善的数据错误验证机制所以这样会省去应用层需要做的大量数据验证工作。
- 如果应用层对数据的校验不那么重视的话,看可以使用性能上更优的UDP,当然也可以使用UDP传输数据,数据校验的工作放到应用层来做也行,这就会加重开发的任务上。
- TCP
-
网络层
- 作用:解决数据由一个计算机的IP如何路由到目标计算机的过程规范,我们的计算机消息发送出去后,是经过了哪些处理才能正确的找到目标计算机,其中包含了IP、ARP、RARP、ICMP等协议。
- 包含:MAC地址、IP地址、域名
-
网络访问层
- 与计算机网络适配器连接。
- 根据合适的方式调整数据传输(不同的传输介质和网络格式不同)
- 把数据转化为电子流或脉冲的形式在传输介质上传输。
- 对发送的数据添加错误检查信息、对接收的数据进行数据检验。
三路握手
过程如下:
- 客户端connect同时,向服务端发送SYN信息,其包括建立此次连接的客户端初始序列号
- 服务端接收到SYN信息后,会ack该信息,同时在ack信息中包含了服务端SYN信息,该SYN信息指定了此次连接中服务端的初始序列号
- 客户端在收到2中的服务端SYN信息后,响应一个ack给服务端
在三路握手成功后,两端都进入ESTABLISHED状态,可以进行后序的read/write。
为什么要三路握手呢
-
tcp需要保证可靠性,通过一系列手段来保证
- 让对方确认自己的初始序列号,这样可以去重消息、排序消息
- 双方均需要知道对方的消息处理能力(包最大长度等),通过SYN信息告知
-
双端均通过发送SYN和接收ACK信息来告知和确认
四路挥手
过程如下:
- 某个应用程序主动调用close,主动关闭连接,它会发送FIN消息给对方
- 接收方接收到FIN消息后,tcp确认该消息,同时会将该消息作为一个文件结束符(end-of-file)传递给应用进程,但该结束符可能不会立即被处理,该结束符也可能在进程接收的其他任何数据之后。
- 应用进行处理到该结束符后,会调用close方法来关闭该连接的socket,关闭时tcp会发送FIN消息、
- 接收步骤3的FIN消息后,接收端tcp会确认该FIN消息,响应ACK
为什么要四路挥手
- 双方都需要发送FIN且响应ACK消息,通常是需要4路消息
- 步骤2和步骤3之间可能仍然有数据流动,半关闭状态
tcp状态变迁
正常情况下的,一次客户端和服务端交互如下:
从客户端和服务端看tcp的状态变迁如下图所示:
总结
OSI模型,它是tcp/ip协议的一种分层划分,每个层级都有其独立的职责,也是通过这种模型,提供了丰富的应用支持(http/ftp等)。
后面我们学习了一个典型的web服务,在c/s架构下,client与server交互的过程及状态变迁。
tcp为了确保可靠性,采取建立连接时的三路握手和断开连接时的四路挥手策略。