一.什么是TCP?它的特点是什么?
1.什么是TCP
-
TCP是一种面向连接(连接导向)的、可靠的基于字节流的传输层通信协议。
-
所谓的“连接”,其实是客户端和服务器的内存里保存的一份关于对方的信息,如 IP 地址、端口号等。
-
TCP 可以看成是一种字节流,它会处理 IP 层或以下的层的丢包、重复以及错误问题。
-
在连接的建立过程中,双方需要交换一些连接的参数。这些参数可以放在 TCP 头部。
2.TCP的特点
- 面向连接的可靠传输协议
- 可以进行流控及拥塞控制
- 可以进行数据分段
- 耗费资源较大,速度较慢
总结:TCP适合效率较低,但准确度较高的应用场景。
二.TCP的三次握手
1.具体是怎样建立链接?
1.1 举例 : A与B俩个第一次接触
-
第一次握手 : 刚开始时A、B俩人不认识,A开始向B介绍自己是谁叫什么。
-
第二次握手 :这时B听完A介绍后,也向A介绍自己是谁叫什么;同时客气的回复了一下很高兴认识你。
-
第三次握手 :当B介绍完并回复很高兴认识你后,A接受到后也跟着回复了一句很高兴认识你。这样俩者之间就建立起了联系。
1.2 TCP真实的建立过程
三次握手(Three-way Handshake)其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。
刚开始时客户端的状态是Closed,服务端状态是Listen。
-
第一次握手 : 第一次握手:客户端给服务端发一个 SYN 报文,并指明客户端的初始化序列号 ISN。此时客户端处于 SYN_SENT 状态。
-
第二次握手:服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,并且也是指定了自己的初始化序列号 ISN(s)。同时会把客户端的 ISN + 1 作为ACK 的值,表示自己已经收到了客户端的 SYN,此时服务器处于 SYN_RCVD 的状态。
-
第三次握手:客户端收到 SYN 报文之后,会发送一个 ACK 报文,当然,也是一样把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于 ESTABLISHED 状态。服务器收到 ACK 报文之后,也处于 ESTABLISHED 状态,此时,双方已建立起了连接。
2.为什么要建立联系?为什么是三次握手?
2.1 为什么建立联系
-
更好的保证可靠性: 建立连接的过程其实就是让通信双方验证各自的发送能力和接受能力是否正常
-
协商一些参数
2.2 为什么是三次握手
(1) TCP连接的特性决定,一次RT(往返)完成一次TCP的动作。
即客户端一次请求携带的seq num必须得到服务端的ack num才会完成。如果没有返回确认报文段,由于重发机制,定时器经过了一次RTO,客户端就会重发报文。那为什么客户端最后一次发送之后,没有等待服务端发回ack报文段? 这是因为服务端第二次发送的报文段里 包含ack以及请求syc报文,相当于把确认报文和请求报文合并了,所以最后客户端回复一个ack报文即可。
(2) 防止失效的报文创建连接。
因为互联网链路是非常复杂的,发送的报文可能会被互联中的网络设备阻塞,经过了一段时间才到达服务器,时间大于了RTO(Retransmission TimeOut)时间,导致客户端重发syc报文(重新创建新的连接,并丢失超时的连接)。如果只有两次握手,那么服务器每接收到syc报文(包括重发的syc报文),就会创建多余的连接,造成服务器的资源浪费。如果有第三次握手,那么客户端就能够识别出服务端发出的syc和ack报文对应的请求连接在客户端是否存活,如果存活则发送第三次握手ack报文,确认建立连接。