欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

TCP/IP四层模型的理解

程序员文章站 2022-07-01 15:19:03
...

应用层

没什么好说的,优秀的文章很多

传输层

TCP传输控制层

TCP是面向连接的,可靠的传输协议

面向连接:当通信双方通过三次握手,并且在都在内部开辟了通信所需要的资源,例如SOCKET缓冲区等,这就算一个连接真正建立了。

整个过程

  • 三次握手:TCP/IP四层模型的理解
  • 发送数据
  • 四次挥手TCP/IP四层模型的理解

利用抓包命令来查看上面的通讯过程

# yum install tcpdump   // 如果没有tcpdump,需要先安装这个程序
# tcpdump -nn -i eth0 port 80
-nn :不转换任何数值型ip和端口号到对应网站和协议
-i	:指定要抓取的网卡,这里指定eth0。不知道有哪些网卡使用ifconfig查看
port:指定要抓取的端口为80

另起终端,用来发送网络请求

# curl www.baidu.com	// 这个命令会进行一次完整的网络通信,且不会保持连接,会进行4次挥手断开连接,最终在原终端就能显示交互的数据了

TCP/IP四层模型的理解

  1. 前三个包就是三次握手的包,然后就是客户端请求百度主页的包(http请求内容),其中Flags[P.]的含义是告诉对方快处理这个包,我没有包继续发了。

  2. 然后百度回复了一个确认包,也就是确认他已经收到了,这就是TCP可靠性的来源。

  3. 百度响应我们刚开的http请求了,给我们返回他的响应数据。然后我们收到了,又给了百度一个确认

  4. 百度刚开的那个包没有将响应内容给发送完毕,因为每次发送的数据的大小是有限制的,所以可能需要分多个包来发完,这个大小是三次握手的时候双方沟通好的,就是win的大小,这个就是告诉对方,你给我发消息一次能发多大的数据包

  5. 然后又给了百度一个确认

  6. 数据交互完毕了,因为Curl是一次完整过的请求,其会进行四次挥手,开始进行四次挥手了。我们主动的向百度发送断开连接的请求

显示当前主机当前有哪些TCP连接

netstat -natp
-n: 禁止将协议中的一些数字或者协议的名称,例如localhost,或者将80转换为http
-a: 显示所有的连接
-t: tcp连接
-p:	显示哪个进程持有这个链接

网络层

查看某个网卡的配置信息

vim /etc/sysconfig/network-scripts/ifcfg-eth0	// 查看eth0这个网卡的配置 

TCP/IP四层模型的理解
这就是这个网卡的配置,dhcp:动态主机配置协议就是动态的获取该网卡的ip地址

ONBOOT:自动启动

查看路由表

# route -n

TCP/IP四层模型的理解

出现了这样的结果,这个结果是什么含义?
每一行代表一个路由规则,决定我们的数据包如何发出去,发到哪去。Metric代表的是跃点的数量,一个跃点代表一个路由器,一般来说系统会优先选择跃点少的路径进行发送。

Use Iface代表这条路由信息是哪个网卡的,如果匹配了对用的路由信息,就从该条路由信息的网卡将数据发送出去,一般我们加入新的网卡,系统都会默认的为我们加一条路由规则,当然我们也可以手动添加。

Genmask,也就是掩码,假如我们现在要发送数据到162.13.12.3,如何决定怎么走?首先用Genmask与之进行与操作,得到的结果再与Destination进行比较,相同就代表这个链路可以到达目标地址,就会数据发送到Gateway(网关)让其继续进行数据的传递,也就是到达了下一跳,这样就进行了一次路由。这里明显如果我们想到达162.13.12.3,就是使用的第二条链路规则,因为其与操作之后结果相同

数据链路层

上面我们说到了网关,我们将数据发送到网关,也就是下一跳。但是问题来了,我们如何发送?ip地址写谁?写我们要到达的目标的ip?还是网关的ip?其实是写的目标的ip地址。那要如何发送到网关呢?这要交给数据链路层来进行操作了,数据链路层利用mac地址来进行通信。利用**arp**协议在已知ip的情况下获取到对应的mac地址。现在已知网关的ip地址,就可以获取到网关的mac地址,然后在链路层上进行发送。又在网络层的数据外部套上一层链路层中的数据,包含了源mac地址(主机的mac)和目标mac地址(网关的mac),当然不只包含这两个数据。然后数据发送到网关之后,把链路层的数据去掉,查看网络层的数据,发现ip地址不是自己,其又会查询其自己的路由表,找到了下一跳。又获取下一跳的mac地址,又套上一层数据链路层的数据,其中包含源mac地址(此时就是网关的mac了)和目标mac地址(此时就是下一跳的mac)了,就这样一直寻找下一条,直到某个位置拆开链路层的数据包之后发现网络层的数据中的ip是自己,这就到达了目标位置。

mac地址,每一次跳跃都会发生变化

mac地址每次跳跃都会改变,那源ip地址和目标ip地址是否会变呢?

这个问题的答案是不一定的,要看场景,我们一般的家庭路由器上网的时候,用户的ip地址一般都是192.168.2.xxx这种形式的,那我们在网络上通信肯定不可能使用这种ip地址啊,这样岂不是会有很多相同的源ip地址在网络上进行请求,怎么区分谁是谁呢?所以说,我们一般的家庭路由器,源ip地址是会改变的,其会被运营商变成一个公网的ip地址,这样响应数据的时候才能正确的路由回来。但是如果你本身就是公网ip,那就不会变化了。这就是看场景。

ARP协议实验

同样打开两个终端

// 第一个终端执行
# tcpdump -nn -i eth0 port 80 or arp	// 监听80端口或者是arp协议的请求

// 第二个终端执行
# arp -d 192.168.163.2 && curl www.baidu.com	
// 第一部分表示删除192.168.163.2的mac地址记录,这样又需要重新去请求该ip的mac地址,这个IP地址是网关的ip地址,这个就是删除了网关的mac地址记录
// 第二部分就是请求百度 ,因为前一部分删除了网关的mac地址记录,这里要向百度发送请求肯定又需要网关的mac地址,我们也就能看到对应的获取mac地址的arp请求

在第一个终端我们就能看到抓到的记录
TCP/IP四层模型的理解
可以看到,最开始的这条arp请求就是用来获取192.168.163.128的mac地址的,这个请求是以广播的形式发出去的,然后192.168.163.128收到了这个广播并回复了他。这就是一个arp请求的形式

注意:arp -d 192.168.163.2 && curl www.baidu.com这个两个命令必须一起执行,因为如果如果先执行第一部分再执行第二部分,可能抓包记录中不会有arp请求,因为其可能会周期性的自动获取某个ip对应的mac,可能在你抓包之前,自动获取了,192.168.163.2 的mac地址就已经有了,当然也就不会发送arp请求了


新的问题,运营商如何区分那么多宽带用户

举个例子,比如我们现在使用没有公网ip的家庭路由器上网,我们现在请求百度,我们的ip地址是192.168.1.2,数据发送出去之后,ip地址会被运营商变成公网ip,然后成功的将数据发送到了百度,但是百度响应数据的时候响应到的是运营商啊,因为请求的源ip地址被运营商变成了他的ip,那运营商如何将数据发送给我们?这就要依赖另外一个技术了:端口映射

内网和外网之间的通信(端口映射)

windows下查看路由表
TCP/IP四层模型的理解
看起来稍微与linux的有所区别,但都是差不多的,这里的接口就与linux下的网卡是一个意思,就决定哪个口出去。在链路上就表示不用经过网关,直接发送到网络中国

相关标签: 网络