网络-深入理解TCP/IP协议

妖精的绣舞 提交于 2020-10-02 21:01:27

深入理解TCP/IP协议

1、TCP/IP协议的概念

先看看百度的定义:

TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议
在这里插入图片描述

TCP/IP 协议是互联网相关各类协议族的总称。那么TCP/IP 协议具体包括了哪些协议呢?

协议名 全名 含义
TCP 传输控制协议(Transmission Control Protocol) TCP 用于从应用程序到网络的数据传输控制。TCP 负责在数据传送之前将它们分割为 IP 包,然后在它们到达的时候将它们重组。(分割、重组)
IP 网际协议(Internet Protocol) IP 负责计算机之间的通信。IP 负责在因特网上发送和接收数据包。
HTTP 超文本传输协议(Hyper Text Transfer Protocol) HTTP 负责 web 服务器与 web 浏览器之间的通信。HTTP 用于从 web 客户端(浏览器)向 web 服务器发送请求,并从 web 服务器向 web 客户端返回内容(网页)。
HTTPS 安全的 HTTP(Secure HTTP) HTTPS 负责在 web 服务器和 web 浏览器之间的安全通信。作为有代表性的应用,HTTPS 会用于处理信用卡交易和其他的敏感数据。
SSL 安全套接字层(Secure Sockets Layer) SSL 协议用于为安全数据传输加密数据。
SMTP 简易邮件传输协议(Simple Mail Transfer Protocol) SMTP 用于电子邮件的传输。
MIME 多用途因特网邮件扩展(Multi-purpose Internet Mail Extensions) MIME 协议使 SMTP 有能力通过 TCP/IP 网络传输多媒体文件,包括声音、视频和二进制数据。
IMAP 因特网消息访问协议(Internet Message Access Protocol) IMAP 用于存储和取回电子邮件。
POP 邮局协议(Post Office Protocol) POP 用于从电子邮件服务器向个人电脑下载电子邮件。
FTP 文件传输协议(File Transfer Protocol) FTP 负责计算机之间的文件传输。
NTP 网络时间协议(Network Time Protocol) NTP 用于在计算机之间同步时间(钟)。
DHCP 简单网络管理协议(Simple Network Management Protocol) DHCP 用于向网络中的计算机分配动态 IP 地址。
SNMP 简单网络管理协议(Simple Network Management Protocol) SNMP 用于计算机网络的管理。
LDAP 轻量级的目录访问协议(Lightweight Directory Access Protocol) LDAP 用于从因特网搜集关于用户和电子邮件地址的信息。
ICMP 因特网消息控制协议(Internet Control Message Protocol) ICMP 负责网络中的错误处理。
ARP 地址解析协议(Address Resolution Protocol) ARP - 用于通过 IP 来查找基于 IP 地址的计算机网卡的硬件地址。(IP-MAC)
RARP 反向地址转换协议(Reverse Address Resolution Protocol) RARP 用于通过 IP 查找基于硬件地址的计算机网卡的 IP 地址。(MAC-IP)
BOOTP 自举协议(Boot Protocol) BOOTP 用于从网络启动计算机。
PPTP 点对点隧道协议(Point to Point Tunneling Protocol) PPTP 用于私人网络之间的连接(隧道)。

2、TCP/IP的分层管理

TCP/IP协议里最重要的一点就是分层。TCP/IP协议族按层次分别为 ,物理层、数据链路层、网络层、传输层、应用层(从下到上)。当然也有按不同的模型分为4层或者7层的。采用分层结构,有利于对应用程序的设计和修改。

在这里插入图片描述

1. 物理层

电脑要组网,就必须通过光缆、电缆、双绞线、无线电波等方式将电脑连起来。这一操作就是物理层的主要任务。它主要规定了网络的一些电气特性,作用是负责传送0和1的电信号

在这里插入图片描述

2. 数据链路层

物理层是负责传送0和1的电信号,那电信号要怎么传呢?总不能一个一个传吧,各个厂家都有自己的一套方法,而其中占据主导的是以太网电信号分组方式

以太网规定,一组电信号构成一个数据包,叫做"帧"(Frame)。每一帧分成两个部分:标头(Head)和数据(Data)。

在这里插入图片描述

①"标头"包含数据包的一些说明项,比如发送者接收者、数据类型等等;"标头"的长度,固定为18字节。

②"数据"则是数据包的具体内容。"数据"的长度,最短为46字节,最长为1500字节。

因此,整个"帧"最短为64字节,最长为1518字节。如果数据很长,就必须分割成多个帧进行发送。

MAC地址

发送者和接收者是如何知道对方就是对的人?难道也确认过眼神?

以太网规定,连入网络的所有设备,都必须具有"网卡"接口。数据包必须是从一块网卡,传送到另一块网卡。网卡的地址,就是数据包的发送地址和接收地址,这叫做MAC地址。

在这里插入图片描述

每块网卡出厂的时候,都有一个全世界独一无二的MAC地址,长度是48个二进制位,通常用12个十六进制数表示。

在这里插入图片描述

前6个十六进制数是厂商编号,后6个是该厂商的网卡流水号。有了MAC地址,就可以定位网卡和数据包的路径了。

有了网卡地址,那发送者也不知道接收者的网卡地址是多少,那要怎么发送呢?这就要用到广播的方式了。

广播

一块网卡是不知道另一块网卡的MAC地址的,但是以太网数据包必须知道接收方的MAC地址,然后才能发送。

有了MAC地址,系统怎样才能把数据包准确送到接收方?

以太网采用了一种很"原始"的方式,它不是把数据包准确送到接收方,而是向本网络内(子网内)所有计算机发送,让每台计算机自己判断,是否为接收方。
在这里插入图片描述

1号计算机向2号计算机发送一个数据包,同一个子网络的3号、4号、5号计算机都会收到这个包。它们读取这个包的"标头",找到接收方的MAC地址,然后与自身的MAC地址相比较,如果两者相同,就接受这个包,做进一步处理,否则就丢弃这个包。这种发送方式就叫做"广播"(broadcasting)。

有了数据包的定义网卡的MAC地址广播的发送方式,数据包就可以准确的在链路层上进行多台计算机之间的传输了。

3. 网络层

广播的对象是同一个子网内的所有主机。如果两台计算机不在同一个子网络,广播是传不过去的。但是互联网是无数子网络共同组成的一个巨型网络,必须找到一种方法,能够区分哪些MAC地址属于同一个子网络,哪些不是。如果是同一个子网络,就采用广播方式发送,否则就采用"路由"方式发送。

在这里插入图片描述

网络层的作用是引进一套新的地址,使得我们能够区分不同的计算机是否属于同一个子网络。这套地址就叫做"网络地址",简称"网址"。

"网络层"出现以后,每台计算机有了两种地址,一种是MAC地址,另一种是网络地址(IP地址)。

网络地址帮助我们确定计算机所在的子网络,MAC地址则将数据包送到该子网络中的目标网卡。

必定是先处理网络地址,然后再处理MAC地址。【先判断是不是同一个子网络,是的话再发送广播数据包】

IP协议

规定网络地址的协议,叫做IP协议。它所定义的地址,就被称为IP地址

目前,广泛采用的是IP协议第四版,简称IPv4。这个版本规定,网络地址由32个二进制位(8个二进制转成一个十进制(0~255),即4个十进制数)组成。

4. 传输层

IP地址能判断两台主机是不是处于同一个子网,MAC地址能保证处于同一子网的不同主机进行数据传输。也就是有了MAC地址和IP地址,我们就可以在互联网上任意两台主机上建立通信。

同一台主机上有许多程序都需要用到网络,比如,你一边浏览网页,一边与朋友在线聊天。当一个数据包从互联网上发来的时候,你怎么知道,它是表示网页的内容,还是表示在线聊天的内容?

这时,就需要加入一位小伙伴,即端口(port)表示这个数据包到底供哪个程序(进程)使用

每个数据包都发到主机的特定端口,所以不同的程序就能取到自己所需要的数据。

端口065535之间的一个整数,正好16个二进制位。**0到1023的端口被系统占用,用户只能选用大于1023的端口。**不管是浏览网页还是在线聊天,应用程序会随机选用一个端口,用来接收从互联网上发来的包。

传输层的功能,就是建立"端口到端口"的通信。网络层的功能是建立"主机到主机"的通信。只要确定主机和端口,我们就能实现程序之间的交流。

Unix系统把主机+端口,叫做"套接字"(socket)

UDP协议

为了在数据包中加入端口信息,就需要新的协议,制定关于端口的协议。

UDP协议,它的格式几乎就是在数据前面,加上端口号。

UDP数据包,也是由"标头"和"数据"两部分组成。

在这里插入图片描述

"标头"部分主要定义了发送端口和接收端口,"数据"部分就是具体的内容。

把整个UDP数据包放入IP数据包的"数据"部分,再把IP数据包放在以太网数据包之中的,所以整个以太网数据包现在变成了下面这样:

在这里插入图片描述

UDP数据包非常简单,"标头"部分一共只有8个字节,总长度不超过65535字节,正好放进一个IP数据包。

TCP协议

UDP协议的优点是比较简单,容易实现。缺点是可靠性较差,一旦数据包发出,无法知道对方是否收到。而TCP协议可以看作是有确认机制的UDP协议

每发出一个数据包都要求确认,如果有一个数据包遗失,就收不到确认,发出方就知道有必要重发这个数据包了。(没说收到就再发一次)

TCP协议能够确保数据不会遗失。它的缺点是过程复杂、实现困难、消耗较多的资源。

5. 应用层(会话层、表示层、应用层)

在7层模型中,应用层包括会话层、表示层、应用层。

应用程序收到传输层的数据,就要对其解读。应用层的作用,就是规定应用程序的数据格式。

TCP协议可以为各种各样的程序传递数据,比如Email、WWW、FTP等等。那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了应用层。

这是最高的一层,直接面对用户。它的数据就放在TCP数据包的数据部分。

在这里插入图片描述

3、从用户角度理解TCP/IP的分层管理

**总的来说,网络通信就是交换数据包。**电脑A向电脑B发送一个数据包,后者收到了,回复一个数据包,从而实现两台电脑之间的通信。

在这里插入图片描述
发送一个数据包,必须要对方的MAC地址、 对方的IP地址,有了这两个地址,数据包才能准确送到接收者手中。

MAC地址有局限性,如果两台电脑不在同一个子网络,就无法知道对方的MAC地址,必须通过网关(gateway)转发。

在这里插入图片描述

1号电脑要向4号电脑发送一个数据包,它先判断4号电脑是否在同一个子网络,结果发现不是,于是就把这个数据包发到网关A。网关A通过路由协议,发现4号电脑位于子网络B,又把数据包发给网关B,网关B再转发到4号电脑。而1号电脑把数据包发到网关A,必须知道网关A的MAC地址,由于1号电脑和网关A是属于同一个子网的,故可以通过广播的方式将数据包准确发送到网关A。

发送数据包之前,电脑必须根据IP地址判断对方是否在同一个子网络,然后选择相应的MAC地址。

1. 配置静态IP地址(专业用户)

在这里插入图片描述

配置静态IP地址必须要知道:本机IP地址、子网掩码、网关地址的IP地址、DNS的IP地址,缺一不可。

2. 配置动态IP地址(普通用户)

动态IP地址,指计算机开机后,会自动分配到一个IP地址,不用人为设定。它使用的协议叫做DHCP协议。

这个协议规定,每一个子网络中,有一台计算机负责管理本网络的所有IP地址,它叫做"DHCP服务器"。新的计算机加入网络,必须向"DHCP服务器"发送一个"DHCP请求"数据包,申请IP地址和相关的网络参数。

如果两台计算机在同一个子网络,必须知道对方的MAC地址和IP地址,才能发送数据包。但是,新加入的计算机不知道这两个地址,怎么发送数据包呢?

DHCP协议

DHCP协议是一种应用层协议,建立在UDP协议之上。

在这里插入图片描述

请求:新加入子网的计算机向"DHCP服务器"发送一个"DHCP请求"数据包
1、最前面的"以太网标头",设置发送方(本机)的MAC地址和接收方(DHCP服务器)的MAC地址。本机的MAC地址是已知的,DHCP服务器的MAC地址不知道,先用广播地址:FF-FF-FF-FF-FF-FF代替。
2、后面的"IP标头",设置发送方的IP地址和接收方的IP地址。对于本机而言,两个都不知道,故先设置发送方的IP地址就为0.0.0.0,接收方的IP地址为255.255.255.255。
3、最后的"UDP标头",设置本机的的端口和DHCP服务器的端口。这一部分是DHCP协议规定好的,本机是68端口,DHCP服务器是67端口。
由上述规则可以看出,数据包是由本机MAC地址+0.0.0.0+68发送到FF-FF-FF-FF-FF-FF+255.255.255.255+67。
由于以太网是广播发送,同一个子网络的每台计算机都收到了这个包。因为接收方的MAC地址是FF-FF-FF-FF-FF-FF`,看不出是发给谁的,所以每台收到这个包的计算机,还必须分析这个包的IP地址,才能确定是不是发给自己的。当看到发出方IP地址是0.0.0.0,接收方是255.255.255.255,于是DHCP服务器知道"这个包是发给我的",而其他计算机就可以丢弃这个包。




应答:DHCP服务器在收到"DHCP请求"后,发送一个"DHCP响应"给新入网的计算机。
DHCP服务器读出这个包的数据内容,分配好IP地址,发送回去一个"DHCP响应"数据包。这个响应包的结构也是类似的,以太网标头的MAC地址是双方的网卡地址,IP标头的IP地址是DHCP服务器的IP地址(发送方)和255.255.255.255(接收方),UDP标头的端口是67(发送方)和68(接收方),分配给请求端的IP地址和本网络的具体参数则包含在Data部分。
新加入的计算机收到这个响应包,于是就知道了自己的IP地址、子网掩码、网关地址、DNS服务器等等参数。

DNS协议

发送数据包,必须要知道对方的IP地址。若只知道网址www.baidu.com,不知道它的IP地址,DNS协议可以帮助我们,将这个网址转换成IP地址。【域名转换为IP地址,也叫正向解析

4、TCP与UDP的区别

TCP和UDP 都是传输层协议

img

面向报文:应用层交给UDP多长的报文,UDP就发送多长的报文,即一次发送一个报文。因此,应用程序必须选择合适大小的报文。【来多少发多少】

面向字节流:虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序看成是一连串的无结构的字节流。TCP有一个缓冲,当应用程序传送的数据块太长,TCP就可以把它划分短一些再传送。【来太多,分开发】

5、TCP的三次握手与四次挥手

客户端和服务端之间的通信

在这里插入图片描述

如果有大量的连接,每次在连接,关闭都要经历三次握手、四次挥手,这显然会造成性能低下。因此。http 有一种叫做长连接(keepalive connections)的机制。它可以在传输数据后仍保持连接,当客户端需要再次获取数据时,直接使用刚刚空闲下来的连接而无需再次握手。

img

6、常见问题解答:

在理解以下问答时,可结合三次握手和四次挥手的表格理解。

6.1为什么要三次握手,而不是两次握手?

答:为了防止失效的连接请求被服务端接收到,导致服务端回复一个ack确认报文段,由于是两次握手,客户端和服务端此时已经建立连接,且客户端确认了服务端能收到数据包,就一直发送数据包给服务端。但是服务端未收到来自客户端的ack确认报文段,就会忽略客户端发送的数据包,一直等待客户端发送ack报文段。这就浪费了服务端的连接。

通俗一点理解三次握手和两次握手: 场景:A和B微信聊天
三次握手:
①A:你好,有空吗?
②B:有空,你有空嘛?
③A:我也有空。
到目前为止两个人都确认了对方现在有空,所以就巴拉巴拉的讲事情(通信)。




两次握手:
①A:你好,有空吗?
②B:有空。
这时,只能确定B有空,而A不一定有空。此时A和B也巴拉巴拉的讲事情。


这就会存在一个问题,如果A发第一条信息,信号不好,B没收到,然后A发第二条信息,这时B回复收到了。由于是两次握手,这时就已经建立了连接,然后A和B讲完事情就没联系了。这时,之前延迟的A的信息,终于发到B的微信上了,这时B回复收到,那么就会再次建立连接,但是问题来了,此时A不在线,那么B就一直等,B的连接资源就浪费了。

6.2 为什么要四次挥手?三次挥手行不行?

答:在关闭连接时,若只有三次挥手,即当服务器发送fin报文段给客户端时,服务端就关闭了连接。若该fin报文段在网络中丢失,服务端不能重发fin报文段,而此时客户端又处于FIN_WAIT_1状态,客户端没收到服务端的关闭请求,就一直等,导致客户端无法关闭连接。故需要四次握手,让客户端能确认服务端也没数据包要发送了,确认服务端发送了关闭请求过来,这时服务端关闭后,客户端才关闭。

6.3 为什么要处于TIME-WAIT状态,等待 2MSL?

答:因为当客户端收到服务端发来的fin报文段,客户端回复了服务端后就直接进入CLOSED状态,而不是TIME-WAIT状态。此时若该回复丢失,那么服务端就会再次发来fin报文段,但是由于客户端已经关闭,那服务端就永远都关闭不了了。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!