TCP/IP 协议,它是 HTTP 协议的下层协议,负责具体的数据传输工作,它非常经典,并且它是目前事实上的网络通信标准
TCP/IP 网络分层模型
TCP/IP 是分层的协议把复杂的网络通信划分出多个层次,再给每一个层次分配不同的职责,层次内只专心做自己的事情就好,用“分而治之”的思想把将问题拆分,从而解决了网络通信的难题。
TCP/IP 总共有层分别是链接层、网际层、数据传输层、应用层
- 链路层:负责在以太网、WiFi 这样的底层网络上发送原始数据包,工作在网卡这个层次,使用 MAC 地址来标记网络上的设备,所以有时候也叫 MAC 层。
- 网际层:IP 协议就处在这一层。因为 IP 协议定义了“IP 地址”的概念,所以就可以在“链接层”的基础上,用 IP 地址取代 MAC 地址,把许许多多的局域网、广域网连接成一个虚拟的巨大网络,在这个网络里找设备时只要把 IP 地址再“翻译”成 MAC 地址就可以了。
- 传输层:这个层次协议的职责是保证数据在 IP 地址标记的两点之间“可靠”地传输,是 TCP 协议工作的层次
- 应用层:有各种面向具体应用的协议。例如 Telnet、SSH、FTP、SMTP 等等,当然还有最常用的 HTTP
MAC 层的传输单位是帧(frame),IP 层的传输单位是包(packet),TCP 层的传输单位是段(segment),HTTP 的传输单位则是消息或报文(message)。但这些名词并没有什么本质的区分,可以统称为数据包。
OSI 参考模型
我们经常听到的7层模型是OSI的概念,OSI把网络按照层次分为七层,由下到上分别为物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
TCP和OSI的区别
TCP/IP 的应用层对应了 OSI 的应用层、表示层和会话层;TCP/IP 的网络接口层对应了 OSI 的数据链路层和物理层
TCP/IP 详细介绍
应用层
我们尝试着连接百度
nc www.baidu.com 80
可以查看下,是连通的
连接有了之后我们作为用户做些什么呢,请求百度的首页走的是应用层的http协议,可以尝试操作写,在刚才的连接下面输入GET / HTTP/1.0 (注意最后要有换行),得到了百度首页的内容
在应用层我们想和百度服务器通信获取页面,先建立连接,然后用协议去发请求,这也是模拟了浏览器输入百度回车的操作
- nc www.baid.com 80 建立连接
- GET / HTTP/1.0 遵循http协议发请求,
传输层
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,一个完整的 TCP 连接的生命周期包括了“建立连接”“传输数据”和“断开连接”三个阶段。
三次握手
TCP通过三次握手建立连接,连接建立完成状态就是ESTABLISHED;有这三次握手的确认方式所以tcp是可靠的,
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 172.17.0.2:55794 36.152.44.95:80 ESTABLISHED 106/nc
双方建立连接的过程,双方会开辟资源切换状态,资源和资源是相互对应的
所以程序想和外部通信,首先需要在传输层听过tcp三次握手建立一个连接
有几个名词
socket: 套接字会衍生出另外一个词四元组(源ip+port 目ip+port 的映射关系,绝对唯一的连接)
port:端口号是内核提供的有约束的,一个系统最多分配65535个
四次分手
四次分手分的是连接,由前面的介绍我们可以知道,连接实际上是服务端和客户端的资源
如果建立连接后网断开了分手失败会怎样,
如果在家连接百度,中间的骨干网瘫痪了,双方其实是不知道另外一方断开了,双方没有物理连接,没有条件反射;只是内存开辟了资源而且和上层是解耦的,也就是和应用层是解耦的,应用程序虽然感知不到,但是内核会有心跳检查(keeplive);内核的心跳是检查当前的四元组是否健康,也就是当前连接的健康;当然应用程序也可以做心跳,这个心跳是检查应用空间角色的健康
抓包验证
通过如下命令请求百度,不要小看这个命令, 执行它包含了建立连接、请求数据、断开连接、退出程序完成的过程
curl www.baidu.com:80
再通过下面的命令去抓包看看
tcpdump -nn -i eth0 port 80
- 1、本地的随机端口号和百度个握手的包syn(传输控制层)
- 2、对方服务器回个一个ack
- 3、本地服务器回复了一个ack
以上包的因为不涉及数据传输所以length都是0;再看下面的包
- 4、本地先发了一个length=77 的get请求
- 5、百度先回了一个ack
- 6、立马又回个1461大小的数据包
- 7、然后我们回个ack
- 8、百度又回个length=1321的包(返回的数据大所以分两个包传输)
- 9、我们继续回ack,其中2782=1460+1321
- 10、后面又进行了四次分手,这边不详细说了,自己看吧....
通过一波实操,逻辑和理论也就对上了哦
网络层
网际层主要是解决数据由一个计算机的IP如何路由到目标计算机的过程规范,我们的计算机消息发送出去后,是经过了哪些处理才能正确的找到目标计算机,其中包含了IP、ARP、RARP、ICMP等协议。
MAC地址
我们的消息如果要在网络中找到对应的目标计算机,那么我们的计算机一定要有一个唯一的地址标识才行,而能区分我们计算机唯一的标识就是我们的网络适配器地址,我们的网络适配器地址是由厂商生产时候就规定了一个复杂的英文串组成。
IP地址
由于MAC地址是一段复杂的字串组成不利于我们计算机进行逻辑运算,而我们的消息要在网络中快速路由到目标计算机,那么就一定需要有一套逻辑运算的规则,,所以就有了ARP协议,ARP协议规定了如何把MAC地址转换为可以用于逻辑运算的数字IP地址。
域名
因为IP地址过长不方便进行记忆,所以为了让用户更方便记忆所以衍生了DNS的服务,DNS完成了把IP地址转为简单容易记忆的域名地址。
链路层
链路层主要是管理物理网络准备所需要的数据,包括
- 1、与计算机网络适配器连接。
- 2、根据合适的方式调整数据传输(不同的传输介质和网络格式不同)
- 3、把数据转化为电子流或脉冲的形式在传输介质上传输。
- 4、对发送的数据添加错误检查信息、对接收的数据进行数据检验。
除却君身三重雪,天下谁人配白衣