UDP和TCP协议
Table of Contents
UDP和TCP协议
1、UDP
1.1、数据包格式
1.2、特点
- 沟通简单。不需要一肚子花花肠子(大量的数据结构、处理逻辑、包头字段)。前提是它相信网络世界是美好的,秉承性善论,相信网络通路默认就是很容易送达的,不容易被丢弃的。
- 轻信他人。它不会建立连接,虽然有端口号,但是监听在这个地方,谁都可以传给他数据,他也可以传给任何人数据,甚至可以同时传给多个人数据。
- 愣头青。做事不懂权变。不知道什么时候该坚持,什么时候该退让。它不会根据网络的情况进行发包的拥塞控制,无论网络丢包丢成啥样了,它该怎么发还怎么发。
1.3、使用场景
- 需要资源少,在网络情况比较好的内网,或者对于丢包不敏感的应用。这很好理解,就像如果你是领导,你会让你们组刚毕业的小朋友去做一些没有那么难的项目,打一些没有那么难的客户,或者做一些失败了也能忍受的实验性项目。
- 不需要一对一沟通,建立连接,而是可以广播的应用。咱们小时候人都很简单,大家在班级里面,谁成绩好,谁写作好,应该表扬谁惩罚谁,谁得几个小红花都是当着全班的面讲的,公平公正公开。长大了人心复杂了,薪水、奖金要背靠背,和员工一对一沟通。
- 需要处理速度快,时延低,可以容忍少数丢包,但是要求即便网络拥塞,也毫不退缩,一往无前的时候。记得曾国藩建立湘军的时候,专门招出生牛犊不怕虎的新兵,而不用那些“老油条”的八旗 兵,就是因为八旗兵经历的事情多,遇到敌军不敢舍死忘生。
TCP三次握手
握手过程
- SYN(Synchronize sequence numbers): TCP首部中的同步序号标志
- ACK(Acknowledgement): 确认字符
时间段 | 客户端 | 服务端 | ||
活动 | 状态 | 活动 | 状态 | |
CLOSED | CLOSED | |||
CLOSED | LISTEN | |||
→ | ||||
第一次握手 | 主动发起连接SYN | SYN-SENT | 收到发起的连接 | SYN-RCVD | ← |
第二次握手 | 收到SYN和ACK | SYN_SENT | 返回SYN并ACK客户端的SYN | SYN_RCVD |
→ | ||||
第三次握手 | 发送ACK的ACK | ESTABLISHED | 收到客户端的ACK | ESTABLISHED |
为什么不是两次握手?
A为客户端,B为服务端
防止服务端建立单方面连接
在A建立连接,发生了第一个请求的时候,由于丢包或超时导致第一个请求包丢了。
A不能确定结果,于是不停的发。终于,一个请求包到了B(A不知道这个请求包到了B)。
B收到了请求包,知道了A的存在。
然后,A发出的迟到的请求包到了B。B认为这个是一个正常的请求,因此建立了连接。
上述过程就是两次握手,我们可以看到如果B在第二次握手以后,继续确认客户端的ack(即第三次握手),就不会建立上面荒谬的连接。
为什么不四次握手?
三次握手可以双方的消息有去有去有回,四次握手完全没有必要。
即便更多次数的握手,也不能保证连接可靠
三次握手的作用?
- 建立连接;
- 确定TCP包的起始序号;(序号是一个32位的计数器,每4ms加1,防止出现冲突)
TCP四次挥手
过程
时间段 | 客户端 | 服务端 | ||
活动 | 状态 | 活动 | 状态 | |
ESTABLISHED | ESTABLISHED | |||
→ | ||||
第一次挥手 | 发送FIN | FIN-WAIT-1 | 接收FIN | CLOSED-WAIT |
← | ||||
第二次挥手 | 收到ACK | FIN-WAIT-2 | 发送ACK | CLOSED-WAIT |
← | ||||
第三次挥手 | 收到FIN,ACK | FIN-WAIT-2 | 发送FIN,ACK | LAST_ACK |
→ | ||||
第四次挥手 | 发送ACK | TIME-WAIT | 收到ACK | LAST_ACK |