应用层
应用层程序是要准备某种协议的数据,在发送前:通过内核完成和外部的连接。
传输层
封装四元组:IP:port,目标网站对应的端口号
TCP
- 面向连接的—TCP三次握手
- 可靠的传输协议—为什么三次,确认机制确保可靠传输
- 这层会出现粘包拆包问题—内核 queue、buffer
三次握手——创建连接
三次握手成功后,client和server都在内存中开辟了资源空间:queue、空间、socket,为对方提供服务。
socket
listen也是一个socket:
netstat -natp //查看端口号
netstat -a //查看所有端口号
netstat -at //查看TCP端口号
netstat -au //查看UDP端口号
sudo ifconfig enp2s0:1 10.1.82.22/24 //ip的编号:enp2s0:1的一号接口, 新的ip地址
如下图,一个连接开辟资源:开辟socket
- TCP很繁忙,会将数据先放入:Recv-Q和Send-Q中,程序什么时候用,什么时候取,数据积压多了,取数据的时候可能发生数据粘连。
- 四元组保证连接的唯一性:由这条四元组信息能够唯一连接一对客户端和服务端接口,不会发生串扰
- 建立连接时,代码应该保证四元组唯一性
四次分手——断开连接
- 断开连接的实质是:客户端和服务端双方销毁资源空间
用curl连接百度80端口,通过listern监听整个连接-传输数据-断开连接的过程
curl www.baidu.com.80
sudo tcpdump -nn -i enp2s0 port 80
程序从网络获得数据的过程:
文件描述符绑定在port上–>程序监听文件描述符–>间接监听port
网络层
封装目标网站的IP地址
给TCP连接增加IP地址,查看本机路由表,当数据包向下一层发送时,需要通过外层链路层携带”下一跳“的IP地址,用于网络路由跳转。
IP
IP地址:Internet Protocol Address,互联网协议地址,它为互联网上的每一个网络和每一台主机配置一个唯一的逻辑地址,用来与物理地址作区分。
**IPV4:**点分字节0.0.0.0~255.255.255.255
**IP地址:**192.168.150.11
子网掩码-Genmask:255.255.255.0,掩码与IP地址”按位与“,得到网络号:192.168.150.0、最后一位“或”,得到主机号:1
掩码的存在能够更快得找到IP地址指向的主机。
**网关Gateway:**在链路层,下一跳的IP地址(例如路由器就是用户下一跳的网关,通过一次次跳转最后找到对应的IP地址)
**网关下一跳 **:从当前主机将数据包交给Gateway–互联网发送数据的原理:数据包到达当前设备,查看设备路由表,根据路由规则,计算下一跳的IP地址。数据包中包含目标IP地址,一直通过这种方式跳到目标IP地址所在服务器。
- 如果和Genmask按位与之后,和目标IP地址相同,代表目标地址在局域网内(192.168.80.1和192.168.80.17属于同一个局域网)可以直连。
链路层
封装网关的MAC地址
数据包中只能放一个IP地址,无法携带下一个网关的IP地址,需要增加链路层携带这个地址对应的MAC地址。
MAC地址
-
MAC地址:Media Access Control Address,媒体访问控制地址,也称作局域网地址,以太网地址或者物理地址。MAC地址用于在网络中唯一标示一个网卡,一台设备若有一或多个网卡,则每个网卡都需要并会有一个唯一的MAC地址。MAC地址生产过程中已经固定。
-
MAC使用:地址跳转过程中实际使用的是MAC地址,当前主机收到数据包后,先查看本机有没有网络IP地址对应的MAC地址缓存记录,如果有直接用,如果没有根据ARP协议,在局域网广播请求,将目标IP地址按照”表“中对应关系映射成MAC地址。
查询MAC地址缓存记录:
arp -n
- 为什么有MAC还要使用IP?:
- IP地址和MAC地址都是用来协助完成网络数据传输的,传输除了发送和接收方以外,还需要路由完成中间过程的接力。如果我们只用MAC地址,路由器就需要记住每个MAC地址所在的子网(否则每次接受到数据包就需要广播找人> … <,太难了)。据说有2^48个MAC地址,路由器需要很大的内存,不现实!
- 如果一个设备接入网络,我们就给它分配一个IP地址,IP前缀代表局域网地址,后缀是在当前局域网的id号,路由拿到IP号之后,马上知道去哪个局域网找这个设备,搜索范围大大减小,并且不需要额外存储子网地址。
网络分层传输原理
- 由网络层封装的IP不会改变,始终包含发送方与接收方的IP和Port;
- 链路层,数据包靠MAC地址在网关直接传递,MAC地址一直在跳变;