OSI模型为七层:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
TCP/IP模型根据业务场景将其分为五层或者四层:物理层和数据链路层合并为网络接口层,网络层、传输层、顶端三层合并为应用层。
下面主要以TCP/IP模型来介绍:
应用层:应用程序自定义的协议,比如http协议,ftp协议等,
传输层:TCP/UDP协议,封装为数据段,段头包含源端口和目标端口,端口在本机唯一即可,用来区分一台机器上的不同服务
网络层:IP协议,再次封装为数据包,包头放源IP地址和目标IP地址。规定通过IP地址(网络地址+主机地址)和子网掩码划分局域网。不在同一局域网内的主机必须通过IP地址找到目标主机,在局域网内则通过mac地址找到目标主机。
数据链路层:Ethernet(以太网)协议,要求有网卡,规定一组电信号构成一个数据包,叫做”帧”。一帧包含head(18字节)和data两部分。head部分包含发送者mac地址、接收者mac地址,数据类型三部分。
物理层: 把二进制数据转换为电信号(比特位)
ARP协议在网络层工作,用于在一个局域网内通过ip地址获取目标mac。
在局域网内是通过mac地址进行通信的,所以在局域网内发送数据包之前,必须先获取目标主机的mac地址。然后是数据链路层通过mac地址通信。
ARP协议的原理是在局域网内广播一个数据包,局域网内的所有主机都可以收到数据包,通过验证数据包中携带的IP地址,来判断自己是不是接收者,若是,则回复自己的mac地址。
情况一:同一局域网内的两台主机通信
计算机1
192.168.10.11/24
计算机2
192.168.10.13/24
1、拿到目标mac地址
ARP协议:
判断两台计算机的子网地址是否一样,如果一样,应该尝试获取计算机2的mac地址
I:计算机1的mac地址 FF-FF-FF-FF-FF-FF 192.168.10.11/24 192.168.10.13/24 数据部分
II:所有计算机都收到该ARP包,
碰到 FF-FF-FF-FF-FF-FF,大家知道对方想跟自己要mac地址
如果目标ip:192.168.10.13/24就是自己,那么就返回mac地址
2、发真正的数据
计算机1的mac地址 计算机2的mac地址 192.168.10.11/24 192.168.10.13/24 数据部分
情况二:跨局域网的两台主机通信
计算机1
192.168.10.11/24
计算机2
202.10.11.13/24
1、拿到目标mac地址
ARP协议:
判断两台计算机的子网地址如果不一样,应该尝试获取网关的mac地址
I:计算机1的mac地址 FF-FF-FF-FF-FF-FF 192.168.10.11/24 192.168.10.1/24 数据部分
II:所有计算机都收到该ARP包,
碰到 FF-FF-FF-FF-FF-FF,大家知道对方想跟自己要mac地址
如果目标ip:192.168.10.1/24就是自己,那么就返回mac地址
2、发真正的数据
计算机1的mac地址 网关的mac地址 192.168.10.11/24 202.10.11.13/24 数据部分
TCP连接经过三次握手,断开经过四次挥手。初始阶段服务器处于LISTEN
状态(监听状态)。
第一次握手
客户端向服务器发送连接请求,数据包内容:syn=1
,seq=x
。x
代表一个序列。客户端进入SYN_SENT
状态。
第二次握手
服务器向客户端回复同意连接,数据包内容:ack=1
,syn=1
,seq=x+1
。服务端进入SYN_RCVD
状态(半连接状态)。
第三次握手
客户端收到服务器发送的同意建立连接的数据包之后,进入ESTABLISHED
状态,并向服务器确认建立连接。数据包内容:ack=1
,seq=x+2
。服务器收到这个数据包之后也进入ESTABLISHED
状态。
第一次挥手
客户端向服务器发送断开连接请求,数据包内容:fin=1
。表示客户端完成了数据传输,客户端进入FIN_WAIT_1
状态。
第二次挥手
服务器收到客户端断开连接的请求,发送数据包:ack=1
。表示同意断开连接。此时服务器处于CLOSE_WAIT
状态。
第三次挥手
等服务器也传输完数据之后,向客户端发送数据包:fin=1
。此时服务器进入LAST_ACK
状态。
第四次挥手
客户端收到服务器的最后的确认断开请求之后,处于TIME_WAIT
状态,向服务器发送数据包:ack=1
,表示确认断开。服务器收到数据包之后,正式断开连接。
半连接池是存在与服务端的一个缓存空间,所有来自客户端的建立连接的初次请求都会存放到半连接池中,服务端从半连接池中获取客户端的请求,然后发送确认连接的数据包。半连接池的空间大小很重要,更大的空间能够抵御洪水SYN攻击,洪水SYN攻击即是第三方模拟大量的客户端发送请求的场景,从而撑满服务端的半连接池,服务端向这些模拟客户端发送确认请求的数据包,模拟客户端并不会给予回应。导致正常的客户端请求无法进入半连接池,显示无法访问。
序列号和确认机制
TCP协议为每个发送数据标上seq序列号,并且要求接收方收到数据之后回复ack数据包,保证数据的正确传输和接收。
重传机制
TCP在发送数据之后,并不会立即将数据删除,而是将数据在本地保存为一个副本。如果没有收到接收方的回复包,会重新传输数据包,直到接收方确认收到。缺点是会占用本地的空间。
拥塞控制和流量控制
想实现网络通信,每台主机需具备四要素
DHCP 动态主机配置协议
局域网内的客户机可以通过dhcp自动获取上述内容。
客户机发出的数据包
以太网头 | ip头 | udp头 | dhcp数据包 |
---|---|---|---|
本机mac FF-FF-FF-FF-FF-FF | 0.0.0.0 255.255.255.255 | dhcpclient(68号端口) dhcpserver(67号端口) | “我需要四要素” |
最前面的”以太网标头”,设置发出方(本机)的MAC地址和接收方(DHCP服务器)的MAC地址。前者就是本机网卡的MAC地址,后者这时不知道,就填入一个广播地址:FF-FF-FF-FF-FF-FF。
后面的”IP标头”,设置发出方的IP地址和接收方的IP地址。这时,对于这两者,本机都不知道。于是,发出方的IP地址就设为0.0.0.0,接收方的IP地址设为255.255.255.255。
最后的”UDP标头”,设置发出方的端口和接收方的端口。这一部分是DHCP协议规定好的,发出方是68端口,接收方是67端口。
这个数据包构造完成后,就可以发出了。以太网是广播发送,同一个子网络的每台计算机都收到了这个包。因为接收方的MAC地址是FF-FF-FF-FF-FF-FF,看不出是发给谁的,所以每台收到这个包的计算机,还必须分析这个包的IP地址,才能确定是不是发给自己的。当看到发出方IP地址是0.0.0.0,接收方是255.255.255.255,于是DHCP服务器知道”这个包是发给我的”,而其他计算机就可以丢弃这个包。
接下来,DHCP服务器读出这个包的数据内容,分配好IP地址,发送回去一个”DHCP响应”数据包。这个响应包的结构也是类似的,以太网标头的MAC地址是双方的网卡地址,IP标头的IP地址是DHCP服务器的IP地址(发出方)和255.255.255.255(接收方),UDP标头的端口是67(发出方)和68(接收方),分配给请求端的IP地址和本网络的具体参数则包含在Data部分。
DHCP服务器回复的数据包
以太网头 | ip头 | udp头 | dhcp数据包 |
---|---|---|---|
服务器mac 客户机mac | 服务器IP地址 255.255.255.255 | dhcpservert(67号端口) dhcpclient(67号端口) | “这是你要的东西” |
新加入的计算机收到这个响应包,于是就知道了自己的IP地址、子网掩码、网关地址、DNS服务器等等参数
域名解析服务,将域名解析为IP地址。
DNS的查找顺序:
浏览器缓存-》操作系统缓存-》本地hosts文件-》本地dns服务-》递归or迭代查询
Linux的hosts文件位置:/etc/hosts
1 | netstat -tunalp # 显示当前系统上所有活动的网络连接、监听端口以及与之相关的进程信息 |
1 | lsof -i :[端口号] # 查看指定端口的占用情况 |
1 | route -n # 查看网关信息 |
1 | ping [目标IP地址] # ctrl+c结束 测试是否两台主机网络是否通 |