Go的Web网络应用开发 | 青训营

63 阅读11分钟

网络协议

  • OSI协议
    • 应用、表示、会话:message(消息)
      • 应用:针对应用的协议
      • 表示:设备固有数据格式和网络标准格式的转换(文字流,图像、声音)
      • 会话:通信管理,复制建立和断开通信连接,
    • 传输: TCP的segment(段),特指TCP报文(存在分段)
      • tcp段
      • udp数据报
    • 网络:狭义的packet,叫分组,ip层报文,存在分片(fragment)
      • 广义,数据报是IP和UDP网络层以上的分层的包的单位
      • 基于IP地址转发分包数据
      • ICMP:IP数据包在发送途中一旦发生异常导致无法到达对端目标地址时,需要给发送端发送一个发生异常的通知
    • 数据链路: 帧frame(帧头尾和载荷),交换机 MAC地址寻址
    • 物理:比特流(bit),介质:双绞线,光纤
  • TCP/IP协议
    • image.png
    • 应用、传输、网络、链路层
    • ARP在OSI 属于数据链路层,TCP/IP属于网络层
    • RARP:通过MAC找ip
      • 通过IP地址获取物理地址
    • 包首部:每个分层会对所要发送的数据附加一个首部,通常包含目标地址和协议相关信息
    • 发送一个消息(如邮件 TCP)
      • TCP源和目标的端口号(识别应用),序号,校验和
      • IP首部源和目标的IP,利用ARP查找接收端的MAC
      • 链路(网络接口)包括源和发送端的MAC地址,以太网类型,FCS判断数据是否因噪声被破坏
      • image.png

IP

  • 路由控制Routing:将分组数据发送到最终目标地址的功能。

  • HOP跳:网络中的一个区间,在一个个跳间转发

    • IP路由:路由器或主机在转发IP数据包时只指定下一个路由器或主机,而不是将到最终目标地址为止的所有通路全都指定出来,每一跳在转发IP数据包时会分别指定下一跳的操作
    • 使得IP是面向无连接型
  • IP无连接

    • 上层如果遇到需要发送给IP的 数据,该数据会立即被压缩成IP包发送出去,不会建立连接。
    • 对端主机关机或不存在,数据包还是会被发送出去,当然,何时从哪收到数据也是不知道的。
    • 原因
      • 简化
        • 不需要面向连接,过于繁琐
      • 提速
        • 每次都要事先建立连接会降低处理速度
    • 通信的可靠性依赖上层TCP实现,简化IP的编码实现
    • image.png
    • 广播:将IP地址中的主机地址部分全部设置为1
  • IPv4到IPv6

    • 支持即插即用,没有DHCP服务器也能自动分配IP地址(DHCP服务器,很多时候是路由器充当,可设置可分配的IP、子网掩码、默认路由)
    • IP地址的扩大与路由控制表的聚合
    • 简化首部结构(不采用首部检验码)性能提升
    • 采用认证和加密功能,应对伪造IP地址的网络安全功能以及防止线路窃听的功能(IPsec)

了解传输层协议

  • TCP
    • 源和目标端口号(16),序列号(32),确认应答号(32),共3行

    • 紧接着数据偏移(4,表示TCP所传输的数据部分应该从TCP包的哪个位开始计算),保留(4),控制位(共8),窗口大小(16),校验和(16),紧急指针(16)

      • 数字偏移可以看作头部长度,不包括选项那一行有20字节长(32位),偏移量可以设置为5,即从20字节之后都是TCP数据
      • image.png
      • 控制位
        • CWR:ECE标志为1时,它置为1通知已将拥塞窗口减小
        • ECE:置为1会通知通信对方,从对方到这边的网络有拥塞,IP首部中ECN为1时将TCP首部中的ECE设置为1
        • URG:该位为1时,表示包中有需要紧急处理的数据。
        • ACK:该位为1时,确认应答的字段变为有效,TCP规定除了最初建立连接时的SYN包之外该位必须设置为 1。
        • PSH:该位为1时,表示需要将收到的数据立刻传给上层应用协议。PSH为0时,则不需要立即传而是先进行缓存。
        • RST:该位为1时表示TCP连接中出现异常必须强制断开连接。
        • SYN:为1表示希望建立连接,并在其序列号的字段进行序列号初始值的设定
        • FIN: 该位为1时,表示今后不会再有数据发送,希望断开连接。
    • 选项(Options长度可以变)和填充(Padding)在最后,共同作为一行

    • 超时重传

      • 在窗口比较大,又出现报文段丢失的情况下,同一个序号的确认应答将会被重复不断地返回。而发送端主机如果连续3次收到同一个确认应答(之所以连续收到3次而不是两次的理由是因为,即使数据段的序号被替换两次也不会触发重发机制),就会将其所对应的数据进行重发。这种机制比之前提到的超时管理更加高效,因此也被称作高速重发控制。
    • 流量控制(窗口控制):TCP提供一种机制可以让发送端根据接收端的实际接收能力控制发送的数据量,这就是所谓的流控制。

      • 接收端主机向发送端主机通知自己可以接收数据的大小,发送端会发送不超过这个限度的数据,该大小限度就被称作窗口大小。
      • 接收主机将自己可以接收的缓冲区大小放入这个字段中通知给发送端,这个字段的值越大,说明网络的吞吐量越高。
      • 流量控制:发送端主机会根据接收端主机的指示(接收端缓冲区面临溢出,设置窗口大小,让发送端的窗口缩小),对发送数据的量进行控制
    • 拥塞控制(较多)

      • TCP有了流控后可以多个数据段发送应答,但仍防止网络拥堵时,突然发送一个较大数据导致网络瘫痪
      • 慢启动
        • 拥塞窗口开始通常为1MSS,可以自己根据实际调整(以太网的标准MSS值为1460字节,因此慢启动的初始值从4380字节【3MSS】开始就可以。)
        • 发送数据,之后每收到一次确认应答(ACK),拥塞窗口的值就加1。
        • 其中,拥塞窗口的大小与接收端主机通知的窗口大小做比较,然后按照它们当中较小那个值,发送比其还要小的数据量。
        • 可以有效的减少通信时连续发包,但它是指数增长,引入慢启动阀值限制
      • 慢启动阈值与高速重发
        • 在超时重发时,重新从慢启动开始,且慢启动阈值设置为当时拥塞窗口一半的大小。
        • 重复确认应答进行高速重发控制,慢启动阀值的大小被设置为当时窗口大小的一半(严格来说,是设置为“实际已发送但未收到确认应答的数据量”的一半。),将新的慢启动阀值+3个数据段的大小并作为拥塞窗口开始通信。
    • 优点

      • 有流量控制,错误控制,拥塞处理等机制,保证了数据传输的可靠性
      • 收到包的顺序乱序时可以进行顺序控制,且面向连接控制了通信流量的浪费
      • 以最大段长度(MSS)将数据进行分割发送,且通过滑动窗口机制提高通信性能,窗口大小就是指无需等待确认应答而可以继续发送数据的最大值。窗口大小为4个段。
      • TCP通过三次握手、四次挥手来建立和断开连接
    • 缺点

      • 慢,传输效率低
      • 占用资源多
      • 容易被DOS/DDOS/CC攻击
  • UDP
    • 不提供复杂的控制机制,没有流量控制来避免网络拥塞,到达顺序乱序不会纠正,不可靠性的数据报协议
    • 利用IP提供面向无连接的通信服务
    • 保证数据的大小,不保证消息一定会到达,出现丢包,UDP不负责重发,应用层可以实现数据报的控制机制(细节交给上层)
    • UDP:将应用程序发来的数据在收到的那一刻,立即按照原样发送到网络上的一种机制
    • 简单高效的应用
      • 音、视频的通信(即时)
      • 广播,多播通信
      • 包总量较少的通信(DNS、SNMP)
      • 限定于 LAN 等特定网络中的应用通信;
    • 源和目标端口号,包长度,校验和,四个字段,各16位

http

  • 输入URI后
  • 先建立一个TCP连接(端口识别应用)
  • 在这个TCP连接上进行请求和应答以及数据报文的发送
  • image.png

三次握手和四次挥手

  • 三次握手
    • 所谓三次握手是指建立一个 TCP 连接时需要客户端和服务器端总共发送三个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发。

流程图:
image.png

  • 第一次握手:客户端将标志位SYN置为1,随机产生一个值seq=x,并将该数据包发送给服务器端,客户端进入SYN_SENT状态,等待服务器端确认。

  • 第二次握手:服务器端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器端将标志位SYN和ACK都置为1,ack=x+1,随机产生一个值seq=y,并将该数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态。

  • 第三次握手:客户端收到确认后,检查ack是否为x+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=y+1,并将该数据包发送给服务器端,服务器端检查ack是否为y+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。

  • 四次挥手

    • 四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发。
    • 由于TCP连接是全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭

流程图: image.png

  • 中断连接端可以是客户端,也可以是服务器端。
    • 第一次挥手:客户端发送一个FIN=1,用来关闭客户端到服务器端的数据传送,客户端进入FIN_WAIT_1状态。意思是说"我客户端没有数据要发给你了",但是如果你服务器端还有数据没有发送完成,则不必急着关闭连接,可以继续发送数据。
    • 第二次挥手:服务器端收到FIN后,先发送ack=u+1,告诉客户端,你的请求我收到了,但是我还没准备好,请继续你等我的消息。这个时候客户端就进入FIN_WAIT_2 状态,继续等待服务器端的FIN报文。
    • 第三次挥手:当服务器端确定数据已发送完成,则向客户端发送FIN=1,ack=u+1报文,告诉客户端,好了,我这边数据发完了,准备好关闭连接了。服务器端进入LAST_ACK状态。
    • 第四次挥手:客户端收到FIN=1报文后,就知道可以关闭连接了,但是他还是不相信网络,怕服务器端不知道要关闭,所以发送ack=w+1后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。服务器端收到ACK后,就知道可以断开连接了。客户端等待了2MSL后依然没有收到回复,则证明服务器端已正常关闭,那好,我客户端也可以关闭连接了。最终完成了四次握手。

总结

  • 信息量优点大
  • 好好消化