前言
TCP和UDP协议是网络编程中重要的传输协议,在客户端和服务端起到一个通信的作用,只有在符合协议的情况下,才可以进行通信,下面是一些重要知识点,主要使用于面试问答,不涉及代码。
正文
01-TCP和UDP协议
TCP协议
TCP协议是一种面向连接的可靠性传输协议,使用序号和确认机制确保数据可靠传输,提供流量和拥塞控制机制,避免网络拥塞。
TCP协议应用场景
效率要求相对低,但对准确性要求相对高的场景。效率没有UDP高。比如:文件传输(准确高要求高、但是速度可以相对慢)、接受邮件、 远程登录。
UDP协议
UDP协议是一种无连接的不可靠传输协议,它数据包形式发送数据,不提供可靠性保证,也不提供拥塞控制机制。UDP适用于对实时性要求较高的场景,如音频,在线游戏等。
UDP协议应用场景
效率要求相对高,对准确性要求相对低的场景。比如QQ聊天、在线视频等,速度要求高,但是出现偶尔断续不是太大问题。
TCP和UDP协议的区别
(1)、TCP 是面向连接的,UDP 是面向无连接的。
(2)、UDP程序结构较简单。
(3)、TCP 是面向字节流的,UDP 是基于数据报的。
(4)、TCP 保证数据正确性,UDP 可能丢包。
(5)、TCP 保证数据顺序,UDP 不保证。
02-TCP协议怎样保证可靠性
(1)、建立连接(标志位):通信前确认通信实体存在。
(2)、序号机制(序号,确认号):确保了数据是按序,完整到达。
(3)、数据校验(校验号):CRC校验全部数据。
(4)、超时重传(定时器):保证因链路故障未能到达数据能被多次重发。
(5)、窗口机制(窗口):提供流量控制,避免过量发送。
(6)、拥塞控制。
03-TCP协议的三次握手建立连接
三次握手流程
SYN指的是同步;ACK指的是确认;Client指的是客户端;Server指的是服务端
(1)、Client将标志位SYN置为1,并将该数据包发送给Server,Client由CLOSED状态进入 SYN_SENT状态,等待Server确认。
(2)、Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为 1,并将该数据包发送给Client以确认连接请求,然后Server进入 SYN_RCVD状态。
(3)、Client收到确认后,检查ACK是否为1,如果正确则将标志位ACK置为1, 并将该数据包发送给Server,Server检查ACK是否为1,正确则连接建立,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
为什么三次握手
(1)、比如A向B发送了一个连接请求,但是由于某些特殊情况,请求失效了,那么A也就是不需要再连接了,但是这个失败的请求又送到了B,此时如果是两次握手,B就会认为已经连接成功,浪费资源。
(2)、A向B发送的连接请求,也有可能因为链路故障导致报文段延迟到达B,此时可能A已经下线,然而B会认为A发送了请求,两次握手的话就会直接建立连接,导致B浪费资源。
04-TCP协议的四次挥手断开连接
四次挥手流程
FIN指的是结束;ACK指的是确认;Client指的是客户端;Server指的是服务端
TCP连接是全双工的,两个方向必须要单独进行关闭,流程是当一方完成数据发送任务后,发送一个FIN来终止自己这个方向的连接,但是不能影响另一方向是否还在发送。只是收到FIN标志位的这一方向上不会再收到数据了。最后当这一方向发送完所有数据也发送了FIN。则表示两方均关闭。
(1)、数据传输结束后,客户端发出断开连接标志位,并停止发送数据,进入 FIN_WAIT_1状态,此时客户端依然可以接收服务器发送来的数据。(向服务端发送FIN)。
(2)、服务器接收到FIN后,发送一个ACK给客户端,确认收到客户端发来的结束标志位,服务器进入CLOSE_WAIT 状态(这个标志指的是服务端可能还有数据没有发送完毕,还在发送)。客户端收到后进入FIN_WAIT_2状态。(向客户端发送ACK)
(3)、当服务器没有数据要发送时,向客户端发送一个FIN报文,此时服务器进入LAST_ACK状态,等待客户端的确认。(向客户端发送FIN)
(4)、客户端收到服务器的FIN报文后,给服务器发送一个ACK报文,此时客户端进入TIME_WAIT状态,等待2MSL(MSL:报文段最大生存时间),然后关闭连接。(向服务端发送ACK)
为什么四次挥手
假设是三次挥手,首先释放了A到B方向的连接,此时TCP连接处于半关闭状态, 这时A不能向B发送数据,而B还是可以向A发送数据。如果此时A收到了B的确认报文段后,就立即 发送一个确认报文段,这会导致B向A还在发送数据时连接就被关闭。这样会导致A没有完整收到B所发的报文段。
几种特殊状态
(1)、FIN_WAIT_2状态:半关闭状态,发送断开请求的一方已经没有发送能力,但是仍然有接收能力。
(2)、CLOSE_WAIT状态:被动关闭连接一方接收到FIN包,会立即发送ACK,表示收到请求,被动关闭一方如果还有数据没有发送完毕,就会进入这个状态。
(3)、TIME_WAIT状态:又叫2MSL等待状态,为了防止服务器没有接收到最后一次挥手时,客户端发送的ACK数据包,防止服务端重传FIN。