OSI参考模型是由ISO(国际标准化组织)提出的网络模型,共分为七层:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层
每一层实现各自的功能和协议,并完成与其相邻层的接口通信.OSI的服务定义详细说明了各层所提供的服务.某一层的服务就是该层及其下各层的一种能力
OSI参考模型中最靠近用户的一层,是为计算机用户提供应用接口,也为用户直接提供各种网络服务.我们常见应用层的网络服务协议有:HTTP,HTTPS,FTP,SMTP等
表示层提供各种用于应用层数据的编码和转换功能,确保一个系统的应用层发送的数据能被另一个系统的应用层识别.如果必要,该层可以提供一种标准表示形式,用于将计算机内部的多种数据格式转换成通信中采用的标准表示形式.数据压缩和加密也是表示层可提供的转换功能之一
会话层就是负责建立,管理和终止表示层实体之间的通信会话.该层的通信由不同设备中的应用程序之间的服务请求和响应组成
传输层建立了主机端到端的链接,传输层的作用是为上层协议提供端到端的可靠和透明的数据传输服务,包括处理差错和流量控制等问题,该层向高层屏蔽了下层数据通信的细节,使高层用户看到的只是在两个传输实体间的一条主机到主机的,可由用户控制和设定的,可靠的数据通路. 我们通常说的TCP,UDP就是在这一层,端口号就是这里的"端"
网络层通过IP寻址来建立两个节点之间的连接,为源端的运输层送来的分组,选择合适的路由和交换节点,正确无误地按照地址传送给目的端的运输层.就是通常说的IP层.这一层就是我们经常说的IP协议层.IP协议是Internet的基础
将比特组合成字节,再将字节组合成帧,使用链路层地址(以太网使用MAC地址)来访问介质,并进行差错检测
实际最终信号的传输都是通过物理层实现的.通过物理介质传输比特流.比如通过网线,中继器,集线器,双绞线传输,这就是物理层的传输介质
TCP/IP五层协议和OSI的七层协议对应关系如下
也可以分为四层,就是把链路层和物理层都表示为网络接口层
TCP/IP的核心是网络层的IP和传输层的TCP,HTTP在应用层
HTTP有无连接的特性,即每次连接只能处理一个请求,收到响应后立即断开连接.HTTP/1.0版本(称为串行连接或短连接,短轮询)中每次HTTP通信后都要断开TCP连接,所以每个新的HTTP请求都需要建立一个新的连接.但是在现在网站动则几十条HTTP请求的情况下.很容易达到浏览器请求上限,并且每次请求都建立新的TCP连接(即每次都有三次握手四次挥手)极大的增加了通信开销
为了解决这个问题,提出了持久连接(长连接,长轮询),一定时间内,同一域名下的HTTP请求,只要两端都没有提出断开连接,则持久保持TCP连接状态,其他请求可以复用这个链接通道,HTTP/1.1实现并默认了所有连接都是持久连接,这样客户端发起多个HTTP请求时就减少了TCP握手造成的网络资源和通信时间的浪费.但是持久连接采用阻塞模式,下次请求必须等到上次响应返回后才能发起,如果上次的请求还没有返回响应内容,下次请求只能等着(线头阻塞)
管道化连接可以不用等待响应返回而发送下个请求并按顺序返回响应,现代浏览器并未默认开启管道化
每个HTTP请求都有一个序列标识符,这样浏览器可以并发多个请求,服务器收到数据后,再根据序列标识符重新排序成不同的请求报文.而不会导致数据错乱.
同样服务端也可以并发返回多个响应给浏览器,浏览器收到后根据序列标识重新排序并归入各自的请求的响应报文.并且同一个域名下的所有请求都复用同一个TCP连接,极大的增加了服务器处理并发的上限.
URI是用来唯一标记服务器上资源的一个字符串,通常也称URL
scheme 协议名host:port 表示资源所在的主机名和端口号path 标记资源所在的位置query 表示对资源附加的额外要求在URI里对@&/等特殊字符和汉字必须要做编码,否则服务器收到HTTP报文后会无法正确处理
(1) HTTP 最大的优点是简单,灵活和易于扩展
(2) HTTP 拥有成熟的软硬件环境,应用的非常广泛,是互联网的基础设施
(3) HTTP 是无状态的,可以轻松是实现集群化,扩展性能,但有时也需要用Cookie技术来实现现有状态
(1) HTTP是明文传输,数据完全肉眼可见,能够方便地研究分析,但也容易被窃听
(2) HTTP是不安全的,无法验证通信双方的身份,也不能判断报文是否被篡改
(3) HTTP的性能不算差,但是不完全适应现在的互联网,还有很大的提升空间
(4) HTTP/ 1.1 以文本格式传输header,有严重的数据冗余,也影响了它的性能
所谓的三次握手即TCP连接的建立.这个连接必须是一方主动打开,另一方被动打开的
最开始的时候,客户端和服务器都是处于Closed状态.主动打开连接的是客户端,被动打开连接的是服务器.
Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时,对此进行标记
Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1
URG紧急指针有效
ACK确认序号有效
PSH 接收方应该尽快将这个报文交给应用层
RST 重置连接
SYN 发起一个新连接
FIN 释放一个连接
PS:不要将确认序号Ack与标志位中的ACK搞混了,确认方Ack=发起方Seq+1两端配对
(1) TCP客户端主动打开连接,结束Closed状态,服务端被动打开连接,结束Closed状态,并且服务端进入了Listen状态,时刻准备接受客户进程的连接请求
(2) TCP客户端向服务器发送TCP报文,并且报文首部的SYN=1,同时选择一个初始序列号seq=x,然后TCP客户端进程进入SYN-SENT(同步已发送状态)状态.
标志位为SYN,表示"请求建立新连接"序号为Seq=X (X一般为1)TCP规定:SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号.
(3) TCP服务器收到请求报文后,如果同意连接,则发出确认报文.确认报文中应该ACK=1,SYN=1,确认号是Ack=x+1,同时也要为自己初始化一个序列号Seq=y,TCP服务器进程进入SYN-RCVD(同步收到)状态
标志位为SYN和ACK,表示确认客户端的报文Seq序号有效,服务器能正常接收客户端发送的数据,并同意创建新连接序号为Seq=y这个报文也不能携带数据,但是同样要消耗一个序号.
(4) TCP客户端进程收到确认后,还要向服务器给出确认.确认报文的ACK=1,ack=y+1,自己的序列号seq=x+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态.
TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号
(5) 当服务器收到客户端的确认后也进入ESTABLISHED状态,此后,双方就可以开始通信了
上述说的比较复杂,下面说个简单的版本
客户端发送一个带SYN=1,Seq=X的数据包到服务器端口(第一次握手,由浏览器发起,告诉服务器我要发送请求了)
服务器发回一个带SYN=1,ACK=X+1,Seq=Y的响应包以示传达确认信息(第二次握手,由服务器发起,告诉客户端我准备接受了,你赶紧发送吧)
客户端再回传一个带ACK=Y+1,Seq=Z的数据包,代表握手结束(第三次握手,由客户端发送,告诉服务器,我马上就发了,你准备接受)
主要为了防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误.
所谓的四次挥手即TCP连接的释放,连接的释放必须是一方主动释放,另一方被动释放
数据传输完毕后,双方都可以释放连接.最开始的时候,客户端和服务器都是处于ESTABLISHED状态,然后客户端主动关闭,服务器被动关闭.
(1) 客户端进程发出连接释放的报文,并且停止发送数据,释放数据报文首部,FIN=1,其序列号为seq=u (等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-Wait-1(终止等待1) 状态
TCP规定,FIN报文段即使不携带数据,也要消耗一个序号
(2) 服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待状态).TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受.这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间
(3) 客户端收到服务器的确认请求后,此时客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前,还要接受服务器发送的最后的数据)
(4) 服务器将最后的数据发送完毕后,就像客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认
(5)客户端收到服务器的连接释放报文后,必须发出确认.ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态.注意此时TCP连接还没有释放,必须经过2*MSL(最长报文段寿命)的时间后,当客户端撤销相应的请求后,才进入CLOSED状态
(6) 服务器只要收到了客户端发出的确认,立即进入CLOSED状态,同样,撤销请求后,就结束了这次的TCP连接,可以看到,服务器结束TCP连接的时间要比客户端早一些
客户端向服务端发送报文,FIN,ACK,Seq,表示已经没有数据传输了,并进入FIN-WAIT-1状态 (第一次挥手:由浏览器发起,发送给服务器,我请求报文发送完了,你准备关闭吧)
服务端发送报文,ACK,Seq,表示同意关闭请求,此时客户端发起方进入FIN-WAIT-2状态.(第二次挥手:由服务器发起的,告诉客户端,我请求的报文接受完了,我准备关闭了,你也准备吧)
服务端先客户端发送报文段,FIN,ACK,Seq,请求关闭连接,并进入LAST-ACK状态,(第三次挥手:由服务器发起,告诉客户端,我响应报文发送完了,你准备关闭吧)
客户端向服务端发送报文段,ACK,Seq,然后进入等待TIME-WAIT状态.服务端收到客户端的报文段后关闭连接,客户端等待一定时间后未收到回复,则正常关闭(第四次挥手:由客户端发起,告诉服务器,我响应报文接受完了,我准备关闭了,你也准备吧)
HTTP属于应用层协议,TCP/UDP属于传输层协议
HTTP(超文本传输协议)是利用TCP在客户端和服务端之间传输信息的协议.
(1) http是基于tcp的, http发送数据包,会先进行tcp三次握手
(2) http 长连接和短连接,在http/1.0中,默认是短连接,也就是每次发送请求都要经历三次握手,四次挥手动作,非常耗性能 .在http/1.1中,默认使用长连接,只需要建立一次连接即可
TCP保证数据的传输,能确保数据安全的从这个端到另一个端,UDP不提供这样的保证
TCP面向连接,建立连接需要3次握手,断开连接需要4次挥手TCP利用握手,ACK和重传机制,UDP没有,TCP对数据准确性比较高,UDP没有TCP效率比UDP效率相对低一些TCP的应用场景(对准确性要求高,但是效率低):呼叫中心,文件上传,远程登录
UDP的应用场景(对准备性要求低,但是效率高):QQ聊天,在线视频,网络直播,广播通信