应用层
表示层
会话层
传输层
网络层
数据链路层
物理层
对于OSI七层参考模型
,我想说只有这七个词条.任何与实际生产脱钩的东西都需要硬性记忆.
而TCP/IP五层模型
我不需要硬性记忆,就可以根据应用逻辑复述出来.
TCP/IP五层模型
应用层
传输层
网络层
数据链路层
物理层
TCP/IP是一组通信协议的代名词,是由一系列协议组成的协议簇.
上图是TCP/IP五层模型
前四层对应的协议.(图片来源自网络,部分翻译与本文有出入)
接下来我们就按顺序来说说每一层.
应用层的协议有:HTTP,FTP,DNS等.他们都是有自己对应端口的,
所谓端口就是:数据由网络到达终端(手机,PC),然后交给谁.QQ聊天的数据就交给QQ,网页浏览的数据就交给浏览器.QQ,浏览器等进程都是有对应端口的.但端口分为不同类型:
IANA:互联网地址编码分配机构(Internet Assigned Numbers Authority)
熟知端口(著名端口):0-1023,由IANA指派和控制.(如:FTP:21,SSH:22,SMTP:25,DNS:53,HTTP:80,HTTPS:443等)
注册端口:1024-49151,IANA不指派也不控制,但须注册.
动态端口(短暂端口):49152-65535,IANA不指派也不控制,无须注册.通常被用来在主动发起连接时随机分配使用.
接下来我们会用HTTP,DNS来走完TCP/IP的五层结构
.用这两个因为:
1.HTTP对应TCP,DNS对应UDP,这样可以囊括传输层的两个重要协议.
2.HTTP与DNS在真实的应用场景下
有穿插.
如上图所示就是我打开简书首页时用HTTP的GET方式发出的请求.(字段有些多,看上去复杂,其实我们做的只是输入一个网址,其他参数浏览器自己会配置好的)
到HTTP的各个字段全都配置好后,其实HTTP的'发'
工作也就已经完成了,下面就该把数据交给传输层的TCP了.(数据传入TCP前还有个小插曲,请看2.2 DNS
)
我在打开网页的时候输入的是http://www.jianshu.com/
,这是域名.但在真实的网络环境下是不会用域名进行通信的.通信时数字的效率永远是最快的,这也就是IP地址(就像生活中的邮编与门牌号).
四川成都温江柳台大道555号 邮编:611130
但完全让我们这些凡夫俗子用输入IP的方式来访问网页也不现实!
www.baidu.com 119.75.217.109
www.163.com 114.80.143.193
DNS(Domain Name System)也就是一个折中.
DNS就是一个域名换IP
的应用协议
.
这也就是上面说的插曲.HTTP请求数据准备完毕后,不是往www.jianshu.com
域名上发,而是往www.jianshu.com
对应的IP上发.以下就是用DNS,以域名
为参数,请求对应的IP地址
.
而且这个DNS请求是直接向IP地址发的,我们在终端(手机,PC)上都会配置DNS服务器的IP地址
,就是用在这的.当然DNS的请求数据准备好后,其实DNS'发'
的工作也就已经完毕了,数据会交给下层传输层的UDP.
以下就是DNS收到的回复:
DNS缓存:当然不可能每回用浏览器打开
www.jianshu.com
都要用DNS询问下DNS服务器
简书的域名对应的IP地址是什么.操作系统本身有DNS缓存,浏览器自己也有DNS缓存.有兴趣请戳:主流操作系统、浏览器DNS缓存时间
前文说到:
DNS将数据准备好后交给UDP.
DNS收到回复,获取到域名对应的IP地址
,HTTP也会将准备好数据交给TCP.
UDP与TCP同属于传输层.他们的关系就好像邮政和顺丰一样.都是快递公司,但由于工作属性,模式,态度的不一样,被不同的应用层协议所用.
TCP---传输控制协议,提供的是面向连接,可靠的字节流服务.当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据.TCP提供数据包重发,丢弃重复数据,检验数据,流量控制,拥塞控制等功能,保证数据能从一端传到另一端.
UDP---用户数据报协议,是一个简单的面向数据报的传输层协议.UDP不提供可靠性,它只是把应用层提供的数据发送出去,但是并不能保证它们能到达目的地.由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有数据包重发等机制,故而传输速度很快.
TCP | UDP |
---|---|
正式通信前先建立连接,结束后断开连接 | 无连接 |
流量控制 | 没这回事 |
数据包重发 | 没这回事 |
丢弃重复数据 | 没这回事 |
拥塞控制 | 没这回事 |
说那么多,简单些的描述就是:
TCP是面向连接
,可靠
的数据传输协议
UDP是无连接
,不可靠
的数据传输协议
接下来我们也会由连接
和可靠
这两块来对TCP和UDP进行对比分析.
在说TCP的面向连接
和可靠
之前,我们先来看看TCP报文段的格式
,因为无论是面向连接
还是可靠
都依赖于TCP报文段的格式
.
很清楚的能看到TCP报文段大体分为两部分:TCP首部,TCP数据部分.
HTTP的数据交给TCP就放在TCP数据部分.
TCP首部:
源端口和目的端口:上面已经说过了应用层协议都有对应的端口号(HTTP:80)
序号(seq):TCP连接中传送的数据流中的每一个字节都编上一个序号.序号字段的值则指的是本报文段所发送的数据的第一个字节的序号.
确认号(ask):是期望收到对方的下一个报文段的数据的第一个字节的序号.
首部长度:它指出TCP首部共有多少个4字节,首部长度可以在20~60字节之间.因此,这个字段值可以在5(5X4=20)至15(15X4=60)之间.
标记位:URG,ACK,PSH,RST,SYN,FIN.标记该TCP报文段的意图(如:ASK==>确认).
窗口:窗口用来控制对方发送的数据量,单位为字节.TCP连接的一端根据设置的缓存空间大小确定自己的接收窗口大小,然后通知对方以确定对方的发送窗口的上限.
检验和:检验和检验的范围包括首部和数据这两部分.在计算检验和时,要在TCP报文段的前面加上12字节的伪首部.
紧急指针:紧急指针指出在本报文段中的紧急数据的最后一个字节的序号.
选项:长度可变.TCP只规定了一种选项,即最大报文段长度 MSS(Maximum Segment Size).MSS告诉对方TCP: