目录
下图为数据分用的过程
认识IP地址
认识MAC地址
认识端口号
网络字节序
sockaddr结构
Makefile新写法
下图为数据分用的过程
认识IP地址
IP协议有两个版本, IPv4和IPv6. 我们整个的课程, 凡是提到IP协议, 没有特殊说明的, 默认都是指IPv4
IP地址是在IP协议中, 用来标识网络中不同主机的地址;
对于IPv4来说, IP地址是一个4字节, 32位的整数;
我们通常也使用 "点分十进制" 的字符串表示IP地址, 例如 192.168.0.1 ; 用点分割的每一个数字表示一个 字节, 范围是 0 - 255(usigned char);
认识MAC地址
MAC地址用来识别数据链路层中相连的节点;
长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可 能会冲突; 也有些网卡支持用户配置mac地址).
终极目标,目的IP(源IP) 为我们未来每一个阶段提供目标方向,方便进行路径选择--->从哪里来到那里去
MAC地址(确保路径的可行性)该类地址一直在变化 --->该类地址一直在变化
认识端口号
端口号(port)是传输层协议的内容.
端口号是一个2字节16位的整数;
端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理;
IP地址 + 端口号能够标识网络上的某一台主机的某一个进程;
一个端口号只能被一个进程占用
IP保证全网唯一,port保证在主机内部的唯一性。
IP+端口即为套接字(socket)
进程已经有pid,为什么要有port呢?
a.系统是系统,网络是网络,单独设置 -> 方便之后的解耦
b.需要客户端每次都能找到服务器进程 -> 服务器的唯一性不能发生任何改变。
c.不是所有进程都要提供网络服务或请求,但是所有进程都需要pid
一个进程可以绑定多个端口号; 但是一个端口号不能被多个进程绑定;
网络字节序
发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出;
接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存;
因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址.
TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节.
不管这台主机是大端机还是小端机, 都会按照这个TCP/IP规定的网络字节序来发送/接收数据;
如果当前发送主机是小端, 就需要先将数据转成大端; 否则就忽略, 直接发送即可
规定网络中的数据为大端。
n为网络 h为主机
l 长 s 短 32 4字节 16 2字节
sockaddr结构
底层OS是如何根据port找到指定进程的?
uint16(整数)-> task_struct->hash
Makefile新写法
cc=g++