回顾
传输层:管理源地址和目标地址的数据传输(确定路线)
网络层:管理选择路由(决定交通工具的类型 :IP协议)
数据链路层:进行相邻节点的数据传输,规划最近运输路线
传输层
端口号(0-65535):找到应用程序
分类:
- 知名端口号:0-1023,FTP:21,SSH:22,Telnet:23,HTTP:80,HTTPS:443,DNS:53(MySQL:3306,Tomcat:8080)
- 动态端口号:1024-65535
一个进程可以绑定多个端口吗?
- 可以
一个端口号可以被多个进程使用吗?
- 不可以
助记:一个人可以有多个手机号,一个手机号不可以被多个人使用!
UDP:
16位UDP长度 = UDP头部长度(8个字节)+ 数据长度
UDP 一个包的最大理论长度 = 2^16 = 65536 = 65536/1024 = 64KB
如果UDP编程时数据大小>64KB会怎样?
- 在应用层进行数据包的拆分和组合
- 交给TCP/IP协议处理,他会在网络层进行分包和组包(不使用这种方法,不保证数据的完整:一个包丢失,那么所有包都会丢失)
校验和:是用来确定数据在传输过程中是否被篡改,用来判断数据的正确性。
如何判断数据的正确性 ?
- 假设数据是以MD5进行校验和的计算,那么原始的数据会先进行MD5得到一个值,把这个值存储在16位的校验和当中
- 接收端接收到内容后 ,按照通过的规则加密数据得到一个校验和,用这个计算出来的校验和,和UDP头中的16位校验和对比
- 如果相等,说明数据是正确的
全双工:发送端或者接收端,既能发送消息,又能接收消息(UDP、TCP)
半双工:发送端只能发送消息,不能接收消息;接收端只能接收消息,不能发送消息
UDP的使用场景:
DNS(域名解析服务)[域名和IP的映射]
基于UDP的应用层协议:
- NFS:网络文件系统
- TFTP:简单文件传输协议
- DHCP:动态主机配置协议
- BOOTP:启动协议(用于无盘设备启动)
- DNS:域名解析协议
TCP:
- URG:当是1时,表示紧急指针
- ACK:是否是确认应答消息,如果是1,表示确认应答消息
- PSH:用来表示是否立即从缓冲区取走数据
- RST:复位标识
- SYN:同步序列号标识(TCP连接时使用)
- FIN:结束序列号标识(TCP断开连接时使用)
16位校验和:用来确定数据在传输过程中是否被篡改,用来判断数据的正确性。
16位窗口大小不等于滑动窗口的大小,因为滑动窗口的大小是固定不变的,所有无需在信息传输中代入
如果16位的滑动窗口为0,那么发送端不会发消息给接收端
TCP的八大机制
TCP面向数据流
流没有明确边界 --> 可能会造成粘包和半包问题
粘包
半包
粘包和半包都是用来指得到的数据不是预期的数据
解决方案
- 使用
\n
作为流的结束符,流就会有边界,就可以正常的收发消息了(更优) - 每次发送固定大小的流信息,确定每个数据边界,就可以正常的收发消息了
TCP异常
- 可以挽救:
- 进程终止/机器重启: 进程终止会释放文件描述符,仍然可以发送FIN. 和正常关闭没有什么区别
- 不能挽救:
- 机器掉电/网线断开:接收端认为连接还在,一旦接收端有写入操作,接收端发现连接已经不在了,就会进行reset,即使没有写入操作,TCP内置了保活定时器,会定期询问对方是否还在,如果对方不在,会直接把连接释放
TCP小结
保证稳定性:
- 确认应答
- 超时重传
- 连接管理
- 流量控制
- 拥塞控制
保证性能:
- 滑动窗口
- 捎带应答
如何使用TCP实现稳定的消息传输?
- 在应用层参考TCP实现稳定性的特性来设计TCP,保证稳定性
- 确认应答、超时重传、连接管理、流量控制、拥塞控制
总结
UDP | TCP |
---|---|
无连接 | 有连接 |
不稳定 | 稳定 |
面向数据报 | 面向数据流 |
有接收缓冲区 | 有接收缓冲区 |
无发送缓冲区 | 有发送缓冲区 |
消息丢失不敏感,要求性能高时使用 | 稳定性要求高时使用 |
本节内容就到这里啦,主要总结了TCP协议的内容
下节内容戳这里