网络应用程序设计模式
- C/S (client/server)
优点 | 1.协议选用灵活 2.可以缓存数据 |
缺点 | 1.对用户安全构成威胁 2.开发工作量大,调试困难 |
优点 | 跨平台 |
缺点 | 只能使用http |
OSI模型 和 TCP/IP模型
OSI模型 | TCP/IP模型 | |
物理层 | 网络接口层 | 模型的基层,负责数据帧的发送与接收(帧是独立的网络信息传输单元)。网络接口层将帧格式的数据放到网络上,或从网络上把帧取下来。 |
数据链路层 | ||
网络层 | 网络层 |
|
传输层 | 传输层 |
|
会话层 | 应用层 | 应用程序通过这一层访问网络.
|
表示层 | ||
应用层 |
以太网帧协议
MAC: Media Access Control Address (以太网地址/物理地址), 每个网卡有唯一的MAC.
目的地址 | 源地址 | 类型 | 数据 | CRC | ||||
6 | 6 | 2 | 46~1500 | 4 | ||||
类型 0800 | IP数据报 | |||||||
2 | 46~1500 | |||||||
类型 0806 | ARP请求/应答 | PAD | ||||||
2 | 28 | 18 | ||||||
类型 8035 | RARP请求/应答 | PAD | ||||||
2 | 28 | 18 |
以太网首部 | 28字节ARP请求/应答 | ||||||||||
以太网的目的地址 | 以太网的源地址 | 帧类型 | 硬件类型 | 协议类型 | 硬件地址长度 | 协议地址长度 | op | 发送端以太网地址 | 发送端IP地址 | 目的以太网地址 | 目的IP地址 |
6 | 6 | 2 | 2 | 2 | 1 | 1 | 2 | 6 | 4 | 6 | 4 |
IP协议
4位版本 (IPv4 / IPv6) | 4位首部长度 | 8位服务类型 (TOS) | 16位总长度 (字节数) | 26字节 | ||||
16位标识 | 3位标志 | 13位偏移 | ||||||
8位生存时间 (TTL) (最多可以跳转多少次) | 8位协议 | 16位首部检验和 | ||||||
32位源IP地址 | ||||||||
32位目的IP地址 | ||||||||
选项 (如果有) | ||||||||
数据 |
UDP协议
无连接的传输协议
- 连接的时候不会握手
- 数据发送出去之后就不管了
使用场景: 效率高,实时传输
0~15 | 16~31 | |
16位源端口号 | 16位目的端口号 | 8字节 |
16位UDP长度 | 16位UDP检验和 | |
数据 (如果有) |
TCP协议
面向连接的、可靠的、基于字节流的传输层通信协议
使用场景: 数据安全性或完整性要求高的时候
标志位:
- URG 紧急指针,告诉接收TCP模块紧要指针域指着紧要数据。
- ACK 置1时表示确认号(为合法,为0的时候表示数据段不包含确认信息,确认号被忽略)。
- PSH 置1时请求的数据段在接收方得到后就可直接送到应用程序,而不必等到缓冲区满时才传送。
- RST 置1时重建连接。如果接收到RST位时候,通常发生了某些错误。
- SYN 置1时用来发起一个连接。
- FIN 置1时表示发端完成发送任务。用来释放连接,表明发送方已经没有数据发送了。
TCP建立连接三次握手:
注: 建立连接和断开连接时如果携带了数据,则确认序号同样还需再加上数据的大小
- 第一次:
客户端:
发送 SYN
随机产生32位序号
服务器:
检测 SYN 值是否为 1
- 第二次:
服务器:
发送 ACK + 确认序号(客户端的随机序号+1)
发起连接请求 (SYN + 32位随机序号)
客户端:
检测标志位是否为 1
检验确认序号是否正确
- 第三次:
客户端
发送确认数据包 (ACK + 确认序号(服务器的随机序号+1))
服务器:
检测 ACK 是否为 1
校验确认序号是否正确
数据传输:
- 每次发送数据都会带有 ACK 标志位
- 当一方收到数据后,会回复一个确认序号(在对方最后发送的一个确认序号上+发送的数据大小). 如果发送方校验到确认序号不对,则会重新发送数据.
断开连接四次挥手(下面假定服务器发起断开请求,如果是客户端则相反):
- 第一次:
客户端:
发送断开请求: FIN + 序号 和 ACK + 序号
服务器:
检测 FIN 值是否为1
校验 ACK 确认序号, 确认上一次数据发送是否完整收到
- 第二次
服务器:
给客户端发送 ACK + 确认序号 (上一次FIN 序号 + 1)
客户端:
校验 ACK 和 确认序号
- 第三次
服务器:
发送断开连接的请求: FIN + 序号 和 ACK + 序号
客户端
校验…
- 第四次:
客户端:
发送 ACK + 序号
服务器:
校验…
0~15 | 16~31 | ||||||
16位源端口号 | 16位目的端口号 | ||||||
32位序号 | |||||||
32位确认序号 | |||||||
4位首部长度 | 保留 (6位) | ![]() | 16位窗口大小 | ||||
16位校验和 | 16位紧急指针 | ||||||
选项 | |||||||
数据 |
数据的发送和接收简述
用户数据 | |||||||
应用层头部 | 用户数据 | ||||||
TCP头部 | 用户数据 | \ | TCP | ||||
IP头部 | TCP头部 | 用户数据 | \ | IP | |||
以太网头部 | IP头部 | TCP头部 | 应用数据 | 以太网尾部 | \ | 以太网帧 |
向下走发送,往上走接收