文章目录
深入理解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),表示这个数据包到底供哪个程序(进程)使用
每个数据包都发到主机的特定端口,所以不同的程序就能取到自己所需要的数据。
端口是0
到65535
之间的一个整数,正好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 都是传输层协议
面向报文:应用层交给UDP多长的报文,UDP就发送多长的报文,即一次发送一个报文。因此,应用程序必须选择合适大小的报文。【来多少发多少】
面向字节流:虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序看成是一连串的无结构的字节流。TCP有一个缓冲,当应用程序传送的数据块太长,TCP就可以把它划分短一些再传送。【来太多,分开发】
5、TCP的三次握手与四次挥手
客户端和服务端之间的通信
如果有大量的连接,每次在连接,关闭都要经历三次握手、四次挥手,这显然会造成性能低下。因此。http 有一种叫做长连接(keepalive connections)
的机制。它可以在传输数据后仍保持连接,当客户端需要再次获取数据时,直接使用刚刚空闲下来的连接而无需再次握手。
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报文段,但是由于客户端已经关闭,那服务端就永远都关闭不了了。
来源:oschina
链接:https://my.oschina.net/u/4353583/blog/4310446