三次握手
三次握手的目的:建立TCP连接
过程如图
图中字符的含义:
SYN :连接请求/接收 报文段seq :发送的第一个字节的序号ACK :确认报文段ack :确认号
第一次握手
客户端向服务端发送一个 SYN 报文(SYN = 1),并指明客户端的初始化序列号 ISN(x),即图中的 seq = x,表示本报文段所发送的数据的第一个字节的序号。
第二次握手
服务器收到客户端的 SYN 报文之后,会发送 SYN 报文作为应答(SYN = 1),并且指定自己的初始化序列号 ISN(y),即图中的 seq = y。同时会把客户端的 ISN + 1 作为确认号 ack 的值,表示已经收到了客户端发来的的 SYN 报文,希望收到的下一个数据的第一个字节的序号是 x + 1。
第三次握手
客户端收到服务器端响应的 SYN 报文之后,会发送一个 ACK 报文,也是一样把服务器的 ISN + 1 作为 ack 的值,表示已经收到了服务端发来的的 SYN 报文,希望收到的下一个数据的第一个字节的序号是 y + 1,并指明此时客户端的序列号 seq = x + 1(初始为 seq = x,所以第二个报文段要 +1)。
为什么要三次握手
目的是让双方都确认各自的收发的正常的
- 第一次握手:客户端什么都不能确认,服务器确认对方发送正常,自己接收正常
- 第二次握手:客户端确认自己和对方的收发都正常
- 第三次握手:服务器确认自己和对方的收发都正常
四次挥手
四次挥手的目的:释放TCP连接
过程如图
图中字符的含义
FIN :连接终止位seq :发送的第一个字节的序号ACK :确认报文段ack :确认号。希望收到的下一个数据的第一个字节的序号
第一次挥手
客户端发送一个 FIN 报文(请求连接终止:FIN = 1),报文中会指定一个序列号 seq = u。并停止再发送数据,主动关闭 TCP 连接
第二次挥手
服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序号值 +1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了。
第三次挥手 如果服务端也想断开连接了(没有要向客户端发出的数据),和客户端的第一次挥手一样,发送 FIN 报文,且指定一个序列号。
第四次挥手 客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答(ack = w+1),且把服务端的序列值 +1 作为自己 ACK 报文的序号值(seq=u+1)。
为什么要四次挥手
因此第二、三次挥手都是从服务器向客户端发出,第二次挥手与第三次挥手之间服务器可能还有数据要发送,不能提前发送FIN 。
TCP与UDP
- TCP是面向连接的。UDP是无连接的,发送数据前不需要先建立连接。
- TCP提供可靠服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付。
- 因为TCP可靠,面向连接,不会丢失数据因此适合大数据量的交换。
- TCP是面向字节流,UDP面向报文,并且网络出现拥塞不会使得发送速率降低(因此会出现丢包,对实时的应用比如IP电话和视频会议等)。
- TCP只能是1对1的,UDP支持1对1,1对多。
- TCP的首部较大为20字节,而UDP只有8字节。
参考文档
关于 TCP 三次握手和四次挥手,满分回答在此
|