1.TCP 的特性
- TCP 提供⼀种⾯向连接的、可靠的字节流服务
- 在⼀个 TCP 连接中,仅有两⽅进⾏彼此通信。⼴播和多播不能⽤于 TCP
- TCP 使⽤校验和,确认和重传机制来保证可靠传输
- TCP 给数据分节进⾏排序,并使⽤累积确认保证数据的顺序不变和⾮重复
- TCP 使⽤滑动窗⼝机制来实现流量控制,通过动态改变窗⼝的⼤⼩进⾏拥塞控制
2.讲⼀下三次握⼿?✨
所谓三次握⼿(Three-way Handshake),是指建⽴⼀个 TCP 连接时,需要客户端和服务器总共发送3个包。
三次握⼿的⽬的是连接服务器指定端⼝,建⽴ TCP 连接,并同步连接双⽅的序列号和确认号,交换 TCP 窗⼝⼤⼩信息。在 socket 编程中,客户端执⾏ connect() 时。将触发三次握⼿。
第⼀次握⼿(SYN=1, seq=x):
客户端发送⼀个 TCP 的 SYN 标志位置1的包,指明客户端打算连接的服务器的端⼝,以及初始序号 X,保存在包头的序列号(Sequence Number)字段⾥。发送完毕后,客户端进SYN_SEND 状态。
第⼆次握⼿(SYN=1, ACK=1, seq=y, ACKnum=x+1):
服务器发回确认包(ACK)应答。即 SYN 标志位和 ACK 标志位均为1。服务器端选择⾃⼰ ISN 序列号,放到 Seq 域⾥,同时将确认序号(Acknowledgement Number)设置为客户的 ISN 加1,即X+1。 发送完毕后,服务器端进⼊SYN_RCVD 状态。
第三次握⼿(ACK=1,ACKnum=y+1)
客户端再次发送确认包(ACK),SYN 标志位为0,ACK 标志位为1,并且把服务器发来 ACK 的序号字段+1,放在确定字段中发送给对⽅,并且在数据段放写ISN的+1发送完毕后,客户端进⼊ ESTABLISHED 状态,当服务器端接收到这个包时,也进⼊ ESTABLISHED 状态,TCP 握⼿结束。
3.讲⼀下四次握⼿?
TCP 的连接的拆除需要发送四个包,因此称为四次挥⼿(Four-way handshake),也叫做改进的三次握⼿。客户端或服务器均可主动发起挥⼿动作,在 socket 编程中,任何⼀⽅执⾏ close() 操作即可产⽣挥⼿操作。
第⼀次挥⼿(FIN=1,seq=x)
假设客户端想要关闭连接,客户端发送⼀个 FIN 标志位置为1的包,表示⾃⼰已经没有数据可以发送了,但是仍然可以接受数据。发送完毕后,客户端进⼊ FIN_WAIT_1 状态。
第⼆次挥⼿(ACK=1,ACKnum=x+1)
服务器端确认客户端的 FIN 包,发送⼀个确认包,表明⾃⼰接受到了客户端关闭连接的请求,但还没有准备好关闭连接。发送完毕后,服务器端进⼊ CLOSE_WAIT 状态,客户端接收到这个确认包之后,进⼊ FIN_WAIT_2 状态,等待服务器端关闭连接。
第三次挥⼿(FIN=1,seq=y)服务器端准备好关闭连接时,向客户端发送结束连接请求,FIN 置为1。发送完毕后,服务器端进⼊ LAST_ACK 状态,等待来⾃客户端的最后⼀个ACK
第四次挥⼿(ACK=1,ACKnum=y+1)
客户端接收到来⾃服务器端的关闭请求,发送⼀个确认包,并进⼊ TIME_WAIT 状态,等待可能出现的要求重传的
ACK 包。
服务器端接收到这个确认包之后,关闭连接,进⼊ CLOSED 状态。
客户端等待了某个固定时间(两个最⼤段⽣命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务
器端的 ACK ,认为服务器端已经正常关闭连接,于是⾃⼰也关闭连接,进⼊ CLOSED 状态。
4. TCP和UDP的区别
a. TCP 是面向连接的,udp 是无连接的即发送数据前不需要先建立链接。
b. TCP 提供可靠的服务。也就是说,通过 TCP 连接传送的数据,无差错,不丢失,不重复,且按序到达; UDP 尽最大努力交付,即不保证可靠交付。并且因为 tcp 可靠, 面向连接,不会丢失数据因此适合大数据量的交换。
c. TCP 是面向字节流,UDP 面向报文,并且网络出现拥塞不会使得发送速率降低(因 此会出现丢包,对实时的应用比如 IP 电话和视频会议等)。
d. TCP 只能是 1 对 1 的,而UDP 支持 1 对 1,1 对多。
e. TCP 的首部较大为 20 字节,而 UDP 只有 8 字节。
f. TCP 是面向连接的可靠性传输,而 UDP 是不可靠的。