TCP定义
全称Transmission Control Protocol(传输控制协议),是一种面向连接,可靠的,基于字节流的传输层通信协议。TCP是为了在不可靠的互联网络上提供更可靠的端到端字节流而专门设计的一个传输协议。
三次握手
三次握手本质是确认通信双方收发数据能力。
在建立一个TCP连接时,需要客户端和服务端总共发送三个包。
首先,我们让信使运输一份信件给对方,对方收到了,那么他就知道了我的发件能力和他的收件能力是可以的。
于是他给我回信,如果我收到了,我便知道我的收件能力和他的发件能力是可以的。
此时,他还不知道我的收件能力和他的发件能力,于是我最后一次反馈,他如果收到了,他便清楚了他的发件能力和我的收件能力是可以的。
四次挥手
四次挥手的目的是关闭一个连接。
TCP的连接的拆除需要发送四个包。
序号:Seq(Sequence Number),序号占32位,用来标识从计算机A发送到计算机B的数据包的序号,计算机发送数据时对此进行标记。
确认号:Ack(Acknowledge Number),确认号占32位,客户端和服务端都能发送,Ack=Seq+1。
标志位:
ACK:确认序号有效
PSH:接收方应该尽快将这个报文交给应用层
RST:重置连接
SYN:建立一个新连接
FIN:断开一个连接
常见问题
1、Q:为什么TCP连接的时候是三次?2次不可以吗?
A:因为需要考虑连接时丢包的问题。
如果只握两次手,第二次握手时如果服务端发给客户端的确认报文段丢失,此时,服务端已经准备好了收发数据(可以理解为服务端已经连接成功),而客户端一直没有收到确认报文,所以客户端不知道服务端是否已经准备好(可以理解为客户端未连接成功)。这种情况下,客户端不会给服务端发数据,也会忽略服务端发过来的数据。
如果是三次握手,即便发生丢包也不会有问题。
2、Q:三次握手可以携带数据吗?
A:第一次、第二次握手不能携带数据。第三次可以。如果有人恶意攻击服务器,每次都在第一次我手中的SYN报文放入大量数据,重复发送大量SYN报文,此时服务器会花费大量内存空间来缓存这些报文,服务器就更容易被攻击了。
3、Q:TCP三次握手失败,服务端会如何处理?
A:握手失败原因有两种:第一种:服务端没收到SYN,则什么都不做;第二种是服务端回复了SYN+ACK后,长时间没有收到ACK响应,则超时后就会发送RST重置连接报文,释放资源。
4、Q:ISN代表什么?意义何在?ISN是固定不变的吗?ISN为什么要动态随机?
A:ISN全称Initial Sequence Number,是TCP发送方的字节数据编号的原点,告诉对方我要开始发送数据的初始化序列号。
如果ISN是固定的,攻击者很容易猜出后序的确认号,为了安全起见,避免被第三方猜到从而发生伪造的RST报文,因此ISN是动态的。
5、Q:什么是半连接队列?
A:服务器第一次收到客户端的SYN之后就会处于SYN_RECD状态,此时双方还没有完全建立连接。服务器会把这种状态下的请求连接放在一个队列里,即半连接队列。
6、Q:为什么握手是三次,而挥手时需要四次呢?
A:TCP握手时,接收端将SYN包和ACK确认包合并到一个包中发送的,所以减少了一个包的发送。