从网络基础到游戏服务器(一)
一、TCP/IP 五层协议栈 与 OSI七层协议栈
产生:开放系统互联(OSI) 是由国际标准化组织(ISO)于70年代提出的七层模型。比因特网协议还早。
区别:七层协议多了会话层和表示层,这两层其实被因特网协议包含在了应用层中。
应用层 | 提供应用接口和网路服务:HTTP/FTP/DNS | |
表示层 | 数据压缩、数据加密、数据描述 | |
应用层 | 会话层 | 建立、管理、终止表示层体之间的会话 |
运输层 | 运输层 | 建立了端到端的连接:TCP、UDP |
网路层 | 网络层 | 通过IP寻址建立两个节点之间的连接 |
链路层 | 链路层 | 比特组成字节、字节组成帧。使用链路层地址来访问介质,选择合适的路由和交换节点:以太网、WIFI |
物理层 | 物理层 | 通过物理介质传输比特流:双绞线、光纤 |
因特网协议 | OSI七层模型 | 详细解释 |
二、TCP/IP 协议
产生:70年代美国国防部为ARPANET广域网开发的网络体系结构和标准。他是一个协议族,包含一组协议,只是因为TCP和IP最有代表性,所以叫TCP/IP协议。
主要包含:
应用层 | Telnet、FTP、SMTP |
传输层 | UDP、TCP |
网络层 | IP、ICMP、IGMP |
链路层 | ARP、RARP |
1)IP协议 Internet Protocol 网际互连协议
组成:首部和数据两部分组成
首部 | 数据 |
20字节定长 | 可选字段,不定长 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | |
0 | 版本 | 首部长度 | 服务类型 | 总长度 | ||||||||||||||||||||||||||||
4 | 标识(片ID) | R | DF | MF | 片偏移 | |||||||||||||||||||||||||||
8 | 生存时间 | 协议 | 首部检查和 | |||||||||||||||||||||||||||||
12 | 源地址 | |||||||||||||||||||||||||||||||
16 | 目的地址 | |||||||||||||||||||||||||||||||
20 | 选项 | |||||||||||||||||||||||||||||||
24 | 数据 |
MTU:最大传输单元
分片:如果IP数据包总长度超过了MAC帧MTU,则数据包需要分片。
特点:不可靠、无连接
2)TCP协议 Transmission Control Protocol 传输控制协议
组成:首部和数据两部分组成
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | |
0 | 源端口号 | 目的端口号 | ||||||||||||||||||||||||||||||
4 | 序号 | |||||||||||||||||||||||||||||||
8 | 确认号 | |||||||||||||||||||||||||||||||
12 | 首部长度 | 保留未用 | CWR | ECE | URG | ACK | PSH | RST | SYN | FIN | 接收窗口 | |||||||||||||||||||||
16 | 校验和 | 紧急数据指针 | ||||||||||||||||||||||||||||||
20 | 选项 | |||||||||||||||||||||||||||||||
24 | 数据 |
MSS:最大报文段长度
序号:字节流中每个字节都按顺序编号
确认号:期望收到下一个报文第一个字节的序号
接收窗口:指示接收方愿意接收的字节数量
TCP三次握手:
四次握手(连接断开):
三、字节序
如果发送的数据是大端序,而接收方是小端序,那么接收到的数据就与想要传达的数据不一致了。
Q. 那么什么数据需要大小端转换?
A. 一个int需要4个字节,如果4个字节大小端顺序不一致,最终表达出来的数字也不一致,所以int需要大小端转换。
string本质上是char数组,一个字符占1个字节,1个字节无论大小端都是一样的,所以string和char类不需要大小端转换。
=>什么数据需要网络传输而且还是int类型呢? IP和Port啊!
大端:网络字节序,低位字节存在高地址位 (套接字通信:收发数据、IP地址、端口 都是大端存储)
小端:主机字节序,低位字节存在低地址位
相关方法:
主机字节序的IP地址转换为网络字节序:inet_pton
大端整型数转换为小端点分十进制IP地址:inet_ntop
点分十进制IP转换为大端整型数: inet_addr
大端整型数转换为点分十进制IP:inet_ntoa
推荐阅读:套接字-Socket