TCP建立和断开连接的过程(三次握手和四次挥手)
TCP通信的过程:
问题:tcp是如何保证数据在客户端和服务端之间通信传输的?
分为三个步骤:三次握手,传输数据确认,四次挥手。三次握手是建立连接,而四次握手是断开连接的过程。
Tcp的概念
传输层协议,提供host-to-host数据的可靠传输,支持全双工,是一个连接导向的协议。
主机到主机(host-to-host):一台主机通过tcp发送数据给另一台主机。
Tcp/ip 5层模型
Tcp协议往上是应用到应用的协议。–应用层
Tcp上层的应用层协议使用tcp时,需要知道端口号----用于区分应用–传输层
主机与主机之间通信,需要知道主机们的网络地址(ip地址),但是tcp不负责把实际地址到地址的传输,tcp把ip交给了底层的互联网层进行处理–网络层
互联网层,也叫网络层,提供地址到地址之间的通信。但不负责信号在具体两个设备之间的传递–链路层,当信号在两个设备之间传递时,又需要物理层封装最底层的物理设备,传输介质等提供最底层的传输能力–物理层
综合以上的5层被称为互联网协议群,也称作tcp/ip协议群。总结下,主机到主机为应用提供到应用间通信的能力。
什么是连接和会话?
连接–数据传输双方都在线,数据收发双方的内存中都建立一个用于维护数据传输状态的对象,连接是网络行为状态的记录。客户端需要与服务器建立连接。
会话:数据双方聊天窗口,是应用的行为。在有些系统中,会话会自动重连,或帮助创建连接,会话也负责在多次连接中保存状态,比如HTTP session在多次http请求(连接)间保存状态(如用户信息)。
双工和单工
- 单工:数据只能单向发送,至少一条线路
- 半双工:某时刻数据向一个方向传输,也可以反方向传输(交替进行),至少一条线路
- 全双工:任何时刻数据都可以双向收发,需要大于一条线路
注:这里的线路抽象,并发的处理信号。
Tcp是一个双工协议,数据在任何时候都可以双向传输。
什么是可靠性?
Tcp是可靠性传输。
可靠性指数据保证无损(原顺序)传输。如果发送方把数据发送给多个接收方—多播,那么所有的接收方都必须收到这个相同的副本。
Tcp的握手和挥手(建立和断开连接)
Tcp的基本操作
- 如果一个host主动向另一个host发起连接,称为SYN,请求同步
- 如果一个host主动主动断开请求,称为FIN,请求完成
- 如果一个host给另一个host发送数据,称为PSH,数据推送
以上3种,接收方收到数据后需要给发送方一个ACK响应,若没有,发送方可能认为自己需要重发这个请求。请求/响应模型是可靠性的要求。
建立连接的过程(三次握手)
为什么要三次握手而不是两次握手?
这是为了防止因为已失效的请求报文,突然又传到服务器,引起错误, 这是什么意思?
假设采用两次握手建立连接,客户端向服务端发送一个syn包请求建立连接,因为某些未知的原因,并没有到达服务器,在中间某个网络节点产生了滞留,为了建立连接,客户端会重发syn包,这次的数据包正常送达,服务端发送syn+ack之后就建立起了连接。
但是第一包数据阻塞的网络突然恢复,第一包syn包又送达到服务端,这时服务端会认为客户端又发起了一个新的连接,从而在两次握手之后进入等待数据状态,服务端认为是两个连接,而客户端认为是一个连接,造成了状态不一致,如果在三次握手的情况下,服务端收不到最后的ack包,自然不会认为连接建立成功。
所以三次握手本质上来说就是为了解决网络信道不可靠的问题,为了在不可靠的信道上建立起可靠的连接,经过三次握手之后,客户端和服务端都进入了数据传输状态。
断开连接的过程(四次挥手)