传输层
五元组:协议号+源IP+源port(端口号)+目的IP+目的port
协议:网络数据传输时,经过的网络节点约定的规则,最终体现为数据格式
IP:在网络层 IP 协议中包含 ip地址这个字段,体现为起点和终点,用于绑定主机。
port:主机中的进程
数据传输
数据传输不是只有起点和终点,传输中途还要经过其他设备
传输的具体线路是由路由算法来计算出的最短路径方向
端口号划分
0 - 1023: 知名端口号, HTTP, FTP, SSH等这些广为使用的应用层协议, 他们的端口号都是固定的.
1024 - 65535: 操作系统动态分配的端口号. 客户端程序的端口号, 就是由操作系统从这个范围分配的.
知名端口号
有些服务器是非常常用的, 为了使用方便, 人们约定一些常用的服务器, 都是用以下这些固定的端口号:
ssh服务器, 使用22端口
ftp服务器, 使用21端口
telnet服务器, 使用23端口
http服务器, 使用80端口
https服务器, 使用443
一个进程可以 bind 多个端口号
一个端口号不可以被多个进程 bind
UDP
校验和:类似文件的 md5,sha1值作为校验码
16位UDP长度, 表示整个数据报(UDP首部+UDP数据)的最大长度;
如果校验和出错, 就会直接丢弃;
UDP 的特点
- 无连接,不可靠(要保持连接,意味双方保持一个连接状态)
- 面向数据报(发送和接收,都只能一次完成)
- 有接收缓冲区,没有发送缓冲区(发送方不关心对方是否接收到,接收方可以接收多个 udp数据)
- 发送数据大小受限(最多 64k)
面向数据报
应用层交给UDP多长的报文, UDP原样发送, 既不会拆分, 也不会合并;
用UDP传输100个字节的数据:
如果发送端调用一次sendto, 发送100个字节, 那么接收端也必须调用对应的一次recvfrom, 接收100个字节; 而不能循环调用10次recvfrom, 每次接收10个字节;
UDP的缓冲区
- UDP没有真正意义上的 发送缓冲区. 调用sendto会直接交给内核, 由内核将数据传给网络层协议进行后续的传输动作;
- UDP具有接收缓冲区. 但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致; 如果缓冲区满了, 再到达的UDP数据就会被丢弃;
关于UDP的问题
- 怎样用 UDP 传输超过 64k 的数据?
- 怎样用 UDP 实现可靠传输?
因为传输层自身的原因,要想解决这些问题,只能在应用层解决,应用程序中(自己的代码)实现类似 TCP 的机制,可以实现传输可靠,传输大小不受限制。
基于UDP的应用层协议
- NFS: 网络文件系统
- TFTP: 简单文件传输协议
- DHCP: 动态主机配置协