网络协议为计算机网络中进行数据交换而建立的规则,标准或约定的集合,所有的计算机/手机等网络设备通信都得遵循网络协议.
网络协议根据通信的步骤,层级划分为7个层级,从上往下为:
- 应用层
- 表示层
- 会话层
- 传输层
- 网络层
- 数据链路层
- 物理层
ip协议(网络层)
ip 实现两个基本功能: 寻址和分段
ip可以根据数据包 包头中包括的目的地址, 将数据包传送到目的地址, 在此过程中, ip只负责选择传送的”道路”, 这种选择道路成为路由功能.
如果有些网络内只能传送小数据包, IP可以将数据包重新组装, 并在报头域注明.
ip模块中包括这些基本功能, 这些模块存在于网络中的每台主机和网关上. 而且这些模块( 特别是网关上 ), 有路由选择和其它服务功能. 对ip来说, 数据包之间没有什么联系 , 对ip不好说什么连接或逻辑链路
ip使用四个关键技术提供服务: 服务类型, 生存时间, 选项, 报头校验码
服务类型指希望得到的服务质量. 服务类型是一个参数集, 这些参数是 Internet 能够提供服务的代表. 这种服务类型由网关使用, 用于在特定的网络, 伙食用于下一个要经过的网络. 伙食下一个要对这个数据包进行路由的网关上选择实际的传送参数. 生存时间是数据包可以生存的时间上限. 它由发送者设置, 由经过路由的地方处理. 如果未到达时生存时间为零. 抛弃此数据包.
对于控制函数来说选项是重要, 但对于通常的通信来说他没有存在的必要. 选项包括时间戳, 安全和特殊路由. 报头校验码保证数据的正确传输, 如果校验出错, 抛弃整个数据包.
tcp(传输层)
TCP( Transmission Control Protocol 传输控制协议 ) 是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。 在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能. 用户数据协议 ( UDP ) 是同一层内另一个重要的传输协议. 在因特网协议族 ( Internet protocol suite ) 中, TCP层是位于IP层之上, 应用层之下的中间层. 不同主机的应用层之间经常需要可靠的, 像管道一样的连接, 但是IP层不提供这种的流机制, 而是提供不可靠的包交换.
应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分区成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元( MTU)的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体 的TCP层。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。
三次握手
TCP是因特网中的传输层协议, 使用三次我手协议建立连接. 当主动方发出SYN连接请求后, 等待对方回答SYN+ACK, 并最终对对方的SYN执行ACK确认. 这种建立连接的方法可以防止错误的连接, TCP使用的流量控制协议是可变大小的滑动窗口协议. TCP 三次握手的过程如下:
客户端发送SYN(SEQ=x)报文给服务器端, 进入SYN_SEND状态服务端收到SYN报文, 回应一个SYN (SEQ=y) ACK(ACK=x+1)报文, 进入SYN_RECV状态客户端收到服务器端的SYN报文, 回应一个ACK(ACK=y+1)报文, 进入Established状态

连接成功
连接成功之后双方即可互相传输字节流,并随时可关闭连接,传输的数据有以下特性:
- 传输的数据被tcp分割成了最适合发送的数据块 传递给ip协议,这个发送数据称为 报文段 或 段
- tcp作为可靠性连接,每次发送数据段,会启动一个定时器,每次接收数据段,会发送一次确认,如果定时器没有及时收到确认,则会重发数据
- TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。
- 两个应用程序通过TCP连接交换8bit字节构成的字节流。TCP不在字节流中插入记录标识符。我们将这称为字节流服务(bytestreamservice)。如果一方的应用程序先传10字节,又传20字节,再传50字节,连接的另一方将无法了解发方每次发送了多少字节。只要自己的接收缓存没有塞满,TCP 接收方将有多少就收多少。一端将字节流放到TCP连接上,同样的字节流将出现在TCP连接的另一端。
四次挥手
建立一个连接需要三次握手, 而终止一个连接要经过四次挥手, 这是由于TCP的半关闭造成的. 具体过程如下:
- 某个应用进程首先调用
close, 称该端执行”主动关闭”active close该端的TCP于是发送一个FIN分节, 表示数据发送完毕 - 接收到FIN的对端执行”被动关闭”
passive close, 这个FIN由TCP确认 - 注意: FIN的接收也作为一个文件结束符(
end-of-file) 传递给接收端应用进程, 放在已排队等候该应用进程接收的任何其它数据之后, 因为 FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收 - 一段时间后, 接收到这个文件结束符的应用进程将调用close关闭它的套接字. 这导致它的TCP也发送一个FIN
- 接收这个最终FIN的原发送端TCP( 即执行主动关闭的那一端 )确认这个FIN. 既然每个方向都需要一个FIN 和一个 ACK, 因此通常需要4个字节
“通常”是指,某些情况下,步骤1的FIN随数据一起发送,另外,步骤2和步骤3发送的分节都出自执行被动关闭那一端,有可能被合并成一个分节。 在步骤2与步骤3之间,从执行被动关闭一端到执行主动关闭一端流动数据是可能的,这称为“半关闭”(half-close)。 当一个Unix进程无论自愿地(调用exit或从main函数返回)还是非自愿地(收到一个终止本进程的信号)终止时,所有打开的描述符都被关闭,这也导致仍然打开的任何TCP连接上也发出一个FIN。 无论是客户还是服务器,任何一端都可以执行主动关闭。通常情况是,客户执行主动关闭,但是某些协议,例如,HTTP/1.0却由服务器执行主动关闭。
具体详解: http://www.imooc.com/article/266145
http协议
超文本传输协议(HTTP,HyperText Transfer Protocol)
技术架构
HTTP是一个客户端 client和服务端 server请求和应答的标准(TCP).
客户端是终端用户,服务器端是网站。通过使用Web浏览器、网络爬虫或者其它的工具,客户端发起一个到服务器上指定端口(默认端口为80)的HTTP请求。(我们称这个客户端)叫用户代理(user agent)。应答的服务器上存储着(一些)资源,比如HTML文件和图像。(我们称)这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在
多个中间层, 比如代理, 网管, 或者隧道( tunnels ). 尽管TCP/IP协议是互联网上最流行的应用, HTTP协议并没有规定必须使用它和它支持的层. 上, HTTP 可以在任何其它互联网协议上, 和在其他网络上实现. HTTP 只假定可靠的传输, 任何能够提供这种保证的协议都可以被其使用.
通常, 由HTTP客户端发起一个请求, 简历一个到服务器指定端口( default:80 ) 的TCP连接. HTTP 服务器则在那个端口监听客户端发送过来的请求. 一旦收到请求, 服务器会向客户端发送一个状态行, 比如 “HTTP/1.2 200 OK” 和响应的消息, 消息的消息体可能是请求的文件, 错误消息, 或者其它的一些信息.
HTTP 使用 TCP 而不是 UDP 的原因在于, 一个网页必须传送很多数据, 而 TCP 协议提供传输控制, 按顺序组织数据, 和错误纠正.
过程解析
http一次请求的过程大概如下:
- 用户在浏览器输入www.easyswoole.com
- dns服务器解析/或者本机hosts,路由器hosts对比 获得ip
- 浏览器访问默认端口80,则访问的tcp地址为 ip:80
- tcp协议3次握手,建立连接
- 发送一个http request请求头
- 服务器获得http request请求头,表明该次访问为http访问,解析http请求头,获得请求类型,请求格式,以及请求数据(cookie,get,post数据)
- 服务器发送response响应数据,主动断开
- 浏览器接收response响应数据,解析响应文本类型,解析数据,断开连接
https协议中,在请求以及响应时多了一层tls,ssl加密解密协议,默认端口从80变为了443
WebSocket协议
websocket协议是基于tcp的一种新的网络协议.
产生背景
在没有WebSocket协议之前,在网页中,实现一个聊天室只能使用ajax 不断轮询,请求服务器是否有数据产生,而这样的实现方法会出现一系列的问题:
- 如果轮询时间间隔太短,会导致客户端和服务端在一个时间段内不断的进行http tcp的握手/挥手动作和http 请求头,响应头的传输,大量消耗服务器资源,如果用户量大的情况,会造成服务器的繁忙以至于宕机
- 客户端每次只能通过发送http 请求获得服务器是否有数据返回,且数据的及时性无法保证
正因为在这种情况下,所以WebSocket出现了,它只需要一次http握手,就可以保持一个长连接,使得服务器可以主动发送消息给客户端,大大减少了轮询机制的消耗
实现原理
在实现websocket连线过程中,需要通过浏览器发出websocket连线请求,然后服务器发出回应,这个过程通常称为“握手” 。在 WebSocket API,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。在此WebSocket 协议中,为我们实现即时服务带来了两大好处:
- Header: 互相沟通的Header是很小的-大概只有 2 Bytes
- Server Push: 服务器的推送,服务器不再被动的接收到浏览器的请求之后才返回数据,而是在有新数据时就主动推送给浏览器。
握手协议

首先,浏览器发起一个http协议的websocket握手请求:
GET /websocket/HTTP/1.1Host: localhostUpgrade: websocket #表示希望将http协议升级到Websocket协议。Connection: Upgrade #表示希望将http协议升级到Websocket协议。Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg== #浏览器随机生成的base64 encode的值,用来询问服务器是否是支持WebSocket。Origin: http://服务器地址Sec-WebSocket-Version: 13
websocket服务器响应:
GET /websocket/HTTP/1.1Host: localhostUpgrade: websocket #表示希望将http协议升级到Websocket协议。Connection: Upgrade #表示希望将http协议升级到Websocket协议。Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg== #浏览器随机生成的base64 encode的值,用来询问服务器是否是支持WebSocket。Origin: http://服务器地址Sec-WebSocket-Version: 13
这样就已经是握手成功了,浏览器和服务端已经建立了一个websocket通道,发送数据不再需要tcp握手,也不需要发送http请求头,服务端也可自动下发数据到浏览器
HTML5 Web Socket API
在HTML5中内置有一些API,用于响应应用程序发起的请求。基本API语句如下:
var ws = new WebSocket(url,name);//创建对象ws.send(msg);//发送文本消息ws.onmessage = (function(evt/*服务器发送数据的对象*/){})();//接收消息回调事件ws.onerror = (function(evt/*错误对象*/){})();//错误处理ws.close();//关闭连接
