Netty系列1-网络模型

  • Post author:
  • Post category:其他




1.OSI七层模型



1.1 OSI七层模型

OSI(Open System Interconnect)全称是开放系统互连参考模型。其七层分为:

(1)物理层

物理层并不是指物理媒体本身,而是指利用物理媒体进行物理连接和数据传输。

物理层的媒体包括光纤、电缆。物理设备保护计算机、手机登。数据通信设备包括调制解调器等。连接器包括接头、插头。

物理层的功能:

  • 为数据端设备提供传输数据的通路,即将多个物理设备连接起来。
  • 传输数据。

    协议有ISO2110

    (2)数据链路层

    数据通道。物理层是物理上通道,长久存在的。数据通道是建立通信连接的通道,连接有生存期。

    数据链路层功能:
  • 链路连接的建立、拆除和分离
  • 差错检测和恢复

    协议有ARP、RARP

    (3)网络层

    路由功能。数据如何正确发送到目的地。

    协议有IP、ICMP

    (4)传输层

    定义传输数据的端口和协议、以及流量控制。

    这里协议有TCP、UDP。

    (5)会话层

    建立、管理、终止会话

    (6)表示层

    把应用层提供的信息变换为能够共同理解的形式

    (7)应用层

    向应用程序提供服务。

    这里的协议有http、ftp。

    我们常说的TCP/IP的协议实现一般是没有会话层和表示层。



1.2 传输处理

网络中传输的数据包由两部分组成:一部分是协议所要用到的首部,另一部分是上一层传过来的数据。首部的结构由协议的具体规范详细定义。在数据包的首部,明确标明了协议应该如何读取数据。

每个分层中,都会对所发送的数据附加一个首部,在这个首部中包含了该层必要的信息,如发送的目标地址以及协议相关信息。

数据从一个客户端发送到另外一个客户端过程:

  • 应用程序会进行编码处理,相当于表示层功能,然后定义何时建立通信何时发送数据,这是会话层。
  • TCP 根据应用的指示,负责建立连接、发送数据以及断开连接。在上层数据首部

    附加一个 TCP 首部。
  • IP 将 TCP 传过来数据当做自己的数据,并在首部的加上自己的IP 首部。
  • 以太网来说将上层数据加上以太网首部并进行发送处理,生成的以太网数据包将通过物理层传输给接收端。
  • 接收端主机收到以太网包后,首先从以太网包首部找到 MAC 地址判断是否为发送给自己的包,若不是则丢弃数据。如果是,则从以太网包首部中的类型确定数据类型,再传给相应的模块,如 IP、ARP 等。
  • IP 从包首部中判断此 IP地址是否是自己,如果是,则根据首部的协议类型将数据发送给对应的模块,如 TCP、UDP。
  • 在 TCP 模块中,首先会计算一下校验和,判断数据是否被破坏。然后检查是否在按照序号接收数据。最后检查端口号,确定具体的应用程序。数据被完整地接收以后,会传给由端口号识别的应用程序。
  • 接收端应用程序会直接接收发送端发送的数据。通过解析数据,展示相应的内容。



2.TCP和UDP



2.1 TCP

TCP是面向连接的,可靠的数据传输。

(1)三次握手

三次握手是指建立TCP连接时,需要客户端和服务端发送三次数据包确立连接。

  • 客户端将标志位SYN置位1,将seq随机设置一个值j。将数据包发往服务端等待响应。客户端进入SYN_SENT状态
  • 服务端接到请求后确认SYN为1,确定这是个连接请求。服务端将SYN和ACK都置位1、ack置位j+1。随机产生一个值seq=k,并将该数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态。
  • 客户端收到回复后,检查ack是否为j+1,ACK是否为1。如果是,将ACK置为1,ack置为k+1,发送数据包。服务端接收到检查ack是否为k+1,ACK是否为1。如果是,确认建立连接。客户端和服务器端进入ESTABLISHED状态。

(2)四次挥手

四次握手是指终止TCP连接时,需要客户端和服务端发送四次数据包。

  • 客户端发送释放报文,设置报文首部FIN为1,seq为u。此时,客户端进入FIN-WAIT-1(终止等待1)状态。并且之后客户端停止发送数据。
  • 服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。但是服务器若发送数据,客户端依然要接受。
  • 客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文。
  • 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
  • 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
  • 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

TCP的特点:

  • 可靠,可重传。
  • TCP数据包中包括序号,所以未按照顺序收到的包可以被排序
  • 以滑动窗口的方式进行流量控制,所谓窗口表示接收能力,用以限制发送方的发送速度。

TCP既然有重传机制,接受端怎么处理重复数据:

TCP中在一定时间内没有等待到确认应答,发送端就可以认为数据已经丢失,并进行重发。但发送方实际上已经收到,只收确认应答发送中丢失或者还在发送途中。

对于接收端来说,反复收到相同的数据是不可取的。所以引入了序列号,序列号是按照顺序给发送数据的每一个字节(8位字节)都标上号码的编号。接收端查询接收数据 TCP 首部中的序列号和数据的长度,将自己下一步应该接收的序列号作为确认应答返送回去。通过序列号和确认应答号,TCP 能够识别是否已经接收数据,从而实现可靠传输。



2.2 UDP

UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。

UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出现丢包现象。而且它不管数据包的顺序、错误或重发。



3.http请求

(1)一次完整的http请求

  • 建立 TCP 连接,HTTP 是比 TCP 更高层次的应用层协议,根据规则,只有低层协议建立之后,才能进行高层协议的连接。
  • 建立TCP连接后,客户端向服务器发送请求命令。比如GET aaa.jsp HTTP/1.1
  • 客户端发送其请求命令之后,还要以头信息的形式向服务器发送一些别的信息,之后客户端发送了一空白行来通知服务器,它已经结束了该头信息的发送
  • 客户端向服务器发出请求后,服务器会客户端返回响应,比如HTTP/1.1 200 OK
  • 服务器返回响应头信息
  • 服务器向客户端发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以 Content-Type 响应头信息所描述的格式发送用户所请求的实际数据
  • 服务器关闭 TCP 连接,一旦服务器向客户端返回了请求数据,它就要关闭 TCP 连接,但如果客户端或者服务器在其头信息加入了Connection:keep-alive ,TCP 连接在发送后将仍然保持打开状态。可节省建立新连接所需时间和网络带宽。



版权声明:本文为huanshirenjian原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。