TCP
TCP是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。TCP仅支持单播传输,面向字节流,提供全双工通信,是可靠传输。
首先:TCP和UDP都是工作在传输层,用于程序之间传输数据的。数据一般包含:文件类型,视频类型,图片等等。
建立连接
一个TCP通信建立连接必须要经过三次握手才能建立起来,简单描述三次握手的过程:
- 当客户端向服务端发起连接时,会先发一包syn包连接请求数据,进行询问,能否建立连接。
- 如果服务端同意连接,则回复一包syn+ack包。
- 客户端收到之后回复一包ack包,连接建立。
三次握手的目的是使数据包的发送和接收同步, 经过三次握手之后,主机A才向主机B正式发送数据。
断开连接
处于连接状态的客户端和服务端,都可以发起关闭连接请求,此时需要四次挥手来进行连接关闭。
- 假设客户端主动发起连接关闭请求,他需要向服务端发起一包fin包,表示要关闭连接,自己进入终止等待1状态,这是第一次挥手。
- 服务端收到fin包,发送一包ack包,表示自己进入了关闭等待状态,客户端进入终止等待2状态,这是第二次挥手
- 服务端此时还可以发送未发送的数据,而客户端还可以接收数据,待服务端发送完数据之后,发送一包fin包,进入最后确认状态。这是第三次挥手。
- 客户端收到之后回复ack包,进入超时等待状态,经过超时时间后关闭连接,而服务端收到ack包后,立即关闭连接。这是第四次挥手。
UDP协议:
首先UDP协议是非连接的,传输数据之前源端和终端不建立连接, 当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。 在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、 计算机的能力和传输带宽的限制; 在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。发送数据就是把简单的数据包封装一下,然后从网卡发出去就可以了,数据包之间并没有状态上的联系,正因为UDP这种简单的处理方式,导致它的性能损耗非常少,对于cpu,内存资源的占用也远小于TCP,但是对于网络传输过程中产生的丢包,UDP并不能保证,所以UDP在传输稳定性上要弱于TCP。
TCP和UDP的主要区别:
UDP | TCP | |
---|---|---|
是否连接 | 无连接 | 面向连接 |
是否可靠 | 不可靠传输,不使用流量控制和拥塞控制 | 可靠传输,使用流量控制和拥塞控制 |
连接对象个数 | 支持一对一,一对多,多对一和多对多交互通信 | 只能是一对一通信 |
传输方式 | 面向报文 | 面向字节流 |
首部开销 | 首部开销小,仅8字节 | 首部最小20字节,最大60字节 |
适用场景 | 对实时性要求较高但是对少量丢包并没有太大要求的场景,比如:域名查询,语音通话 | 对网络通讯质量要求较高的场景,需要准确无误的传输给对方,比如,传输文件,发送邮件 |