1. TCP连接过程
1.1 三次握手
- 第一次握手:客户端向服务端发起建立连接请求,客户端会随机生成一个起始序列号 x x x,客户端向服务端发送的字段中包含标志位 S Y N = 1 SYN=1 SYN=1,序列号 s e q = x seq=x seq=x;
- 第二次握手:服务端在收到客户端发来的报文后,会随机生成一个服务端的起始序列号 y y y,然后给客户端回复一段报文,其中包括标志位 S Y N = 1 SYN=1 SYN=1, A C K = 1 ACK=1 ACK=1,序列号 s e q = y seq=y seq=y,确认号 a c k = x + 1 ack=x+1 ack=x+1;
- 第三次握手:客户端收到服务端发来的报文后,会再向服务端发送报文,其中包含标志位 A C K = 1 ACK=1 ACK=1,序列号 s e q = x + 1 seq=x+1 seq=x+1,确认号 a c k = y + 1 ack=y+1 ack=y+1。
1.2 四次挥手
- 第一次挥手:客户端发出连接释放报文段,其中 F I N = 1 , s e q = p FIN=1,seq=p FIN=1,seq=p,并停止再发送数据,主动关闭TCP连接,等待服务端的确认;
- 第二次挥手:服务端收到连接释放报文段后即发出确认报文段 A C K = 1 , s e q = q , s e q = p + 1 ACK=1,seq=q,seq=p+1 ACK=1,seq=q,seq=p+1;客户端收到服务端的确认后,此时服务端还有未发送完毕的数据,客户端需等待服务端发送完毕;
- 第三次挥手:服务端发送完数据,发出连接释放报文段 F I N = 1 , A C K = 1 , s e q = r , a c k = p + 1 FIN=1,ACK=1,seq=r,ack=p+1 FIN=1,ACK=1,seq=r,ack=p+1;
- 第四次挥手:客户端收到服务端的连接释放报文段后,对此发出确认报文段 A C K = 1 , s e q = p + 1 , a c k = r + 1 ACK=1,seq=p+1,ack=r+1 ACK=1,seq=p+1,ack=r+1。
2. TCP有哪些特点?
- TCP是面向连接的传输层协议。
- 点对点,每一条TCP连接只能有两个端点。
- TCP提供可靠交付的服务。
- TCP提供全双工通信。
- 面向字节流。
3. TCP和UDP的区别
- TCP面向连接;UDP是无连接的,即发送数据之前不需要建立连接。
- TCP提供可靠的服务;UDP不保证可靠交付。
- TCP面向字节流,把数据看成一连串无结构的字节流;UDP是面向报文的。
- TCP有拥塞控制;UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如实时视频会议等)。
- 每一条TCP连接只能是点到点的;UDP支持一对一、一对多、多对一和多对多的通信方式。
TCP首部开销20字节;UDP的首部开销小,只有8个字节。
4. TCP 和 UDP 分别对应的常见应用层协议
基于TCP的应用层协议有:HTTP、FTP、SMTP、TELNET、SSH
- HTTP:HyperText Transfer Protocol(超文本传输协议),默认端口80
- FTP: File Transfer Protocol (文件传输协议), 默认端口(20用于传输数据,21用于传输控制信息)
- SMTP: Simple Mail Transfer Protocol (简单邮件传输协议) ,默认端口25
- TELNET: Teletype over the Network (网络电传), 默认端口23
- SSH:Secure Shell(安全外壳协议),默认端口 22
基于UDP的应用层协议:DNS、TFTP、SNMP
- DNS : Domain Name Service (域名服务),默认端口 53
- TFTP: Trivial File Transfer Protocol (简单文件传输协议),默认端口69
5. TCP的粘包和拆包
TCP是面向流,没有界限的一串数据。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。
要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包;接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包;要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包;
解决方案:
- 发送端将每个数据包封装为固定长度
- 在数据尾部增加特殊字符进行分割
- 将数据分为两部分,一部分是头部,一部分是内容体;其中头部结构大小固定,且有一个字段声明内容体的大小。
6. 说说TCP是如何确保可靠性的呢?
- TCP的连接是基于三次握手,而断开则是基于四次挥手。确保连接和断开的可靠性。
- TCP会记录哪些数据发送了,哪些数据被接收了,哪些没有被接受,并且保证数据包按序到达,保证数据传输不出差错。
- 它有数据包校验、ACK应答、超时重传(发送方)、失序数据重传(接收方)、丢弃重复数据、流量控制(滑动窗口)和拥塞控制等机制。
7. TCP的滑动窗口机制和拥塞控制
详情见我另一篇文章:https://blog.csdn.net/qq_37117595/article/details/125976912