前言:
原本这篇应该写《c++进程通信——套接字(socket)》,但是实际查找相关资料和视频教程发现,我之前的理解还是太浅薄,必须要把TCP/IP和计算机操作系统IO了解清楚,才可以理解清楚socket,所以,接下来这两篇博文,我会重新介绍下这些知识。此外,后面还会找机会介绍下rpc通信。
简介:
本文将以最简单明了的图,给大家讲解清楚TCP/IP模型。之前已有的文章大家看起来之所以晦涩难懂,有的即使懂了,也难以记忆,原因是计算机的这些知识太抽象了,并没有对那些凭空的知识、加以实战,供大家理解和实物化。本文介绍到的相关知识,都会在最后一节的实战,给大家详细的讲解下。(以保证非计算机学科的同学都可以看懂和理解)
讲解TCP/IP模型前,我们先简单的介绍下OSI模型。
What Is the OSI Model?
The Open Systems Interconnection (OSI) model describes seven layers that computer systems use to communicate over a network. It was the first standard model for network communications, adopted by all major computer and telecommunication companies in the early 1980sThe modern Internet is not based on OSI, but on the simpler TCP/IP model. However, the OSI 7-layer model is still widely used, as it helps visualize and communicate how networks operate, and helps isolate and troubleshoot networking problems.
OSI was introduced in 1983 by representatives of the major computer and telecom companies, and was adopted by ISO as an international standard in 1984.
以上英文节选自OSI Model
翻译:
什么是OSI模型?
开放系统互连(OSI)模型描述了计算机系统用于通过网络进行通信的七个层。它是网络通信的第一个标准模式,在20世纪80年代初被所有主要的计算机和电信公司采用。
现代互联网不是基于OSI,而是基于更简单的TCP/IP模型。然而,OSI 7层模型仍然被广泛使用,因为它有助于可视化和沟通网络的运行方式,并有助于隔离和排除网络问题。
OSI于1983年由主要计算机和电信公司的代表引入,并于1984年被ISO采纳为国际标准。

从上文翻译我们可以看到。现代互联网不是基于OSI,而是基于更简单的TCP/IP模型,所以我们后面不再过多介绍了,接下来我会详细介绍下TCP/IP模型及应用。
20世纪50年代末,正值美苏冷战时期,当时美国军方为了避免自己的计算机被炸毁,导致整个网络瘫痪,于是美国国防部的高级研究计划局建设了一个军用网,保证即便部分计算机被袭击摧毁,其他部分仍然正常通信和联系。这个军用网络,就是大名鼎鼎的“阿帕网。”
早期,阿帕网采用的是一种名为NCP的网络协议,NCP协议有一个很大硬伤,它只能用于同构环境中。
什么叫同构环境?
意思就是使用Windows操作系统的用户,不能和MacOS操作系统的用户进行通信,也不能和Android 的用户通信。
1974年,卡恩和瑟夫带着研究成果,在IEEE期刊上,发表了一篇题为《关于分组交换的网络通信协议》的论文,正式提出TCP/IP,用以实现计算机网络之间的互联。
IP协议为每一台联网的设备分配一个地址,TCP则负责发现传输问题。
1983年,美国国防部高级研究计划局决定淘汰NCP协议,TCP/IP取而代之。
参考:一文看完TCP/IP的发展历程








网络层是为了解决什么问题?


ip:192.168.3.245
子网掩码:255.255.255.0
网关:192.168.3.1

route -n

说明:

按照我们上面说的:IP地址和子网掩码做二进制与
问题:网关地址找到了,数据包由网关交给百度,这个IP地址应该放百度的IP(14.215.177.38)还是网关的的地址(192.168.3.1)?
答:应该放百度的IP,问,放百度的IP,你家的网关怎么知道吓一跳发给谁?
答:找到网关地址后,应该找mac地址,把IP地址套起来。(链路层网卡的mac的地址)
在以下图片中,IP和端口号,我们简单写为SIP.(如实战中介绍的百度的IP和端口号)
- 查看网关对应的mac地址arp -a



来自于
TCP/IP五层(或四层)模型:https://blog.csdn.net/m0_59155415/article/details/124909497

协议:要求双方必须遵守的规则(双方遵从的同一),这样大家就可以通信了。
如何建立链接?
访问百度的过程
nc wwww.baidu.com 80
输出如下

(2).使用netstat查看建立的链接
刚才的nc有没有建立链接呢,怎么确认呢?你不能听我忽悠你对吧?
我们可以使用netstat -natp命令查看下建立的链接。(备足:实验使用centos环境,1、windows下虽然可以使用netstat,但是无法查看进程名字建立和链接。2、windows下安装的ubuntu系统使用netstat也不可以,同样查看不到。)
netstat -natp
输出如下

(3)、我们可以查看下百度的ip.
其ip就是我们nc建立链接的ip地址:110.242.68.4

获取百度的主页,HTTP协议,协议版本号1.0.
GET / HTTP/1.0

这个过程是百度内部处理的,我们看不到,但是我们可以看到第四步的数据。(其实百度回复的数据,我们可以使用抓包工具抓到,后面我们会在《四、实战、三》中使用抓包工具tcpdump,再深入的讲解下)

向百度获取步骤是上面四个,简单来说,其实也可以说成是两个。
除了和百度建立网络链接,其实还可以和其他服务端建立链接。比如redis-server.
redis服务端的端口号6379.



redis是一个键值数据库,设置key1 的值为1234
set key2 1234

总结:建立链接,就是在内核分配了资源。分配的资源用来发送和接收数据。


使用tcpdump查看下四次分手的过程。
tcpdump --nn -i ens33 port 80
或者也可以使用,tcpdump --nn -i - X ens33 port 80,可以看到具体的抓到的数据。
输出如下

然后,请求百度主页(如下图,可以看到百度页面已经请求回来了)
curl http://www.baidu.com
输出如下

最后:查看tcpdump抓到的包

分析抓到的包

三次握手建立链接后,就可以通信了

百度分三次回复数据包
备注:


cd /etc/sysconfig/network-scripts/
cat ifcfg-ens33
arp -d 192.168.3.1 && curl http:www.baidu.com
tcpdump --nn -i ens33 port 80 or arp
