TCP
TCP英文叫Transmission Control Protocol,中文叫传输控制协议,它其实就是一种网络传输协议。
汽车在公路上行驶,需要遵守交通规则,同样数据在网络上传输也要遵守一套规则,这个规则就叫协议。
而TCP是一种面向连接的协议,也就是说,在收发数据前,必须和对方确认已经建立了可靠的连接。
建立连接的方式又称为三次握手:
- 第一次握手,主机A向主机B发出请求数据包:“我想给你发数据,可以吗?”这是第一次对话。
- 第二次握手,主机B向主机A发送同意连接,并要求同步的数据包(同步就是两台主机协调工作,一台在发送,一台在接收):“可以,你什么时候发?”这是第二次对话。
- 第三次握手,主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接收吧!”这是第三次对话。
这三次对话的目的是使数据包的发送和接收同步,TCP协议是一定要经过这三次对话之后,主机A才可以向主机B正式发送数据。
TCP建立连接需要进行三次握手,但是断开连接却要进行四次挥手:
- 第一次挥手,在主机A完成数据传输后,将控制位FIN置1,提出停止TCP连接的请求。
- 第二次挥手,主机B收到FIN位置上的1信息后对其做出响应,确认这一方向上的TCP连 接将关闭,将ACK置1。
- 第三次挥手,B主机再提出反方向的关闭请求,并将控制位FIN置1,发送给A主机,并关闭连接。
- 第四次挥手,主机A对主机B的请求进行确认,将ACK置1,并关闭连接,至此双方关闭连接。
TCP协议的这种复杂的建立连接和断开连接的规则,其实是为了使网络数据的传输更加安全可靠,使发送数据端和接收数据端在数据正式传输前就有了交互,为数据正式传输打下了可靠的基础。
同时在数据的传输过程中TCP还具有流量控制,差错控制等功能,比如发送端发送的数据速度过快,而接收端的接收速度却很慢,就很难保证数据不丢失,所以需要进行流量控制。
而TCP是使用滑动窗口的方式来进行流量控制的,可以把这个滑动窗口理解成一个缓冲区,接收端利用滑动窗口的值来告诉发送端对它所发送的数据能提供多大的缓冲区,以此来协调控制两边的传送节奏和速率。
UDP
UDP英文叫User Datagram Protocol,中文叫用户数据报协议,它也是一种网络传输协议,但是它和TCP有很大的不同。
UDP主要有以下几个特点:
- UDP是一个非连接的协议,传输数据之前,源端和终端不建立连接,当它想传送时,就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。
在发送端,UDP传送数据的速度仅受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。
- 由于传输数据不建立连接,因此不需要维护连接状态,包括收发状态等。一台服务机可同时向多个客户机传输相同的消息。
- UDP信息包的包头很短,只有8字节,相对于TCP的20字节包头信息,UDP的包头开销很小。
- 吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制。
- UDP会尽最大努力去传输和接受数据且没有限制,但并不保证可靠的数据交付,主机也不需要维持复杂的链接状态表(里面有许多参数)。
- UDP是面向报文的。发送方的UDP对应用程序传过来的报文,在添加包头后就向下交付给IP层。既不拆分,也不合并,而只是保留这些报文的边界,因此,应用程序需要自己限制合适的报文大小,以免报文太大导致丢失率高。
我们经常使用ping命令来测试两台主机之间的TCP/IP通信是否正常。
其实ping命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包到达的消息及时反馈回来,那么网络就是通的,并且可以通过返回的数据包计算响应时间。
总结一下就是,TCP安全、可靠、面向连接,但是传输速度慢。UDP不安全、不可靠、面向非连接,但是传输速度快。