
UDP和TCP是传输层的协议。
- UDP是面向无连接的,TCP是面向连接的;
- UDP是基于数据报发送数据的,一个一个地发,一个一个地收;TCP是面向字节流的。
- TCP是可以拥塞控制的,当它意识到报丢弃了或者网络的环境不好了,就会根据情况调整自己的行为。而UDP就不会,应用让发就发。
- TCP是一个有状态服务,它可以精确的记着发送了没有,接收到没有,发送到那个了,应该接收哪个了。而UDP则是无状态服务,不管发送的有没有接收成功。
UDP的包头
当发送的UDP包到达目标机器后,发现MAC地址匹配,于是就取下来,将剩下的包传给处理IP层的代码,把IP头取下来,发现目标IP匹配。在IP头里有个8位协议,这里可以判断是数据是TCP还是UDP,最后根据TCP或者UDP头的格式将数据解析出来,解析出来的数据根据UDP包头里的端口号交给相应应用程序。
UDP使用场景
- 需要资源少,在网络情况比较好的内网,或者对于丢包不敏感的应用。
- 不需要一对一沟通,建立连接,而是可以广播的应用。UDP的不面向连接的功能,可以使得可以承载广播或者多播的协议。
- 需要处理速度快,时延低,可以容忍少数丢包的应用。
TCP的包头
除了有源端口号和目标端口号未,还以下:
- 包的序号,编号是为了解决乱序的问题;
- 确认序号,发出去的包应该有确认,要不然不知道对方有没有收到,如果没有收到就应该重新发送,直到送达,这个可以解决不丢包的问题。
- 状态位,SYN是发起一个连接,ACK是回复,RST是重新连接,FIN是结束连接等,TCP是面向连接的,因而双方要维护连接的状态,这些状态位的包的发送,会引起双方的状态变更。
- 窗口大小,TCP要做流量控制,通信双方各声明一个窗口,标识自己当前能够处理的能力。
要掌握TCP协议,重点应该关注以下几个问题:
- 顺序问题;
- 丢包问题;
- 连接维护;
- 流量控制;
- 拥塞控制;
TCP的三次握手

一开始客户端和服务器端都处于CLOSED状态,先是服务器主动监听某个端口,处于LISTEN状态。然后客户端主动发起连接SYN,之后处于SYN-SENT状态,服务器端收到发起的连接,返回SYN,并且ACK客户端的SYN,之后处于SYN-RCVD状态,客户端收到服务器端发送的SYN和ACK之后,发送ACK的ACK,之后处于ESTABLISHED状态,因为它一发一收成功了,服务端收到ACK的ACK之后,处于ESTABLISHED状态,因为它也一发一收了。
TCP四次挥手


四次握手
参考文章:
TCP协议(上):因性恶而复杂,先恶后善反轻松
网友评论