TCP/IP五层(四层)模型——传输层(UDP协议、TCP协议)
传输层
传输层是TCP/IP五层(四层)模型的第二层,主要负责数据能够从发送端传输接收端
1 端口号
- 端口号是一个2字节16为的整数
- 端口号用来标识一个进程,告诉操作系统,当前的这个数据要交给哪一个进程来处理
- IP地址 + 端口号能够标识网络上的某一台主机的某一个进程(即套接字)
- 一个端口号只能被一个进程占用,而一个进程可以占用多个端口号
pid和端口号的区别:
pid和端口号都可以表示一个进程,但是区别在于每一个进程都有pid,但不是每个进程都有端口号(通俗来讲,只有上网的pid才有端口号)
1.1 端口号划分
| 端口号 | 名称 | 含义 |
|---|---|---|
| 0——1023 | 知名端口号 | HTTP,FTP,SSH等这些广为使用的应用层协议,他们的端口号是固定的 |
| 1024——49151 | 注册端口号 | 这些端口多数没有明确的定义服务对象,不同程序可根据实际需要自己定义 |
| 49152——65535 | 私有端口号 | 理论上,不应为服务分配这些端口 |
1.2 常见知名端口号
查看所有知名端口号命令
cat /etc/services
| 端口号 | 服务进程 |
|---|---|
| 21 | FTP服务器 |
| 2000 | FTP客户端 |
| 22 | SSH服务器 |
| 23 | TELNET |
| 25 | SMTP服务器 |
| 80 | HTTP服务器 |
| 2001 | FTTP客户端 |
| 443 | HTTPS |
一个进程可以绑定多个端口号吗??一个端口号可以被多个线程绑定吗??
一个进程可以绑定多个端口,一个端口是不能被多个进程绑定的,
因为端口号+IP=套接字,IP表示目标电脑的地址,端口表示目标电脑操作系统上的进程。所以套接字可以唯一标识一个进程,如果一个端口被多个程序绑定,那么就不知道数据该发送给谁。所以,一个端口是不能被多个进程绑定的。但是,一个进程可以绑定多个端口,不同的端口连接不同的服务器程序,已提供不同的服务。
2 UDP协议
2.1 UDP报文格式

- UDP报文长度位8字节
- 16位源端口号决定有效载荷如何交付
- 16位UDP长度表示整个数据报(UDP部首+UDP数据)的最大长度
- 如果校验和出错,那么整个报文直接丢弃
- UDP协议首部中有一个16位的最大长度. 所以一个UDP能传输的数据最大长度是2^16 = 64K(包含UDP首部),但是64K很小,如果我们需要传输的数据超过64K, 就需要在应用层手动的分包, 多次发送, 并在接收端手动拼装
2.2 UDP的特点
1 无连接
知道对端的IP和端口号就直接进行传输,不需要建立连接
2 不可靠
没有确认机制,没有重传机制,如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息
3 面向数据报
不能灵活的控制读写数据的次数和数量,即应用层交给UDP多长的报文,UDP原样发送,既不拆分也不合并
2.3 UDP缓冲区
- UDP没有UDP没有真正意义上的发送缓冲区. 调用sendto会直接交给内核, 由内核将数据传给网络层协议进行后序的传输动作
- UDP具有接收缓冲区. 但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致; 如果缓冲区满了, 再到达的UDP数据就会被丢弃;
全双工 :UDP的socke既能读又能写,且能同时进行,叫做全双工
半双工 :不能同时进行的叫做半双工
2.4 基于UDP的应用层协议
NFS:网络文件系统
TFTP:简单文件传输协议
DHCP:动态主机配置协议 (是路由器的功能,集成在路由器中,自动获取IP,向路由器申请获得)
BOOTP:启动协议(无盘启动)
DNS:域名解析协议
3 TCP协议——传输控制协议
3.1 说到TCP首先要想到TCP的报文格式,TCP的可靠性和TCP的效率和TCP的粘包问题,这些在我的博客TCP协议中都有讲解
3.2 基于TCP的应用层协议
HTTP:超文本传输协议
HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版
SSH:是建立在应用层和传输层基础上的安全协议
Telnet:是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式
FTP:文件传输协议
SMTP:简单邮件传输协议
4 TCP与UDP协议的对比
- TCP用于可靠传输的情况,应用于文件传输,重要状态更新等场景
- UDP用于对高速传输和实时性要求较高的通信领域(早期QQ,视频传输等),UDP还可以用于广播
