网络协议-IP/TCP/Http/websocket协议

310 阅读8分钟

1.理论

7层为标准

OSI(Open System Interconnect),即开放式系统互联。 一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互连模型。

image.png

  • 7.应用层:FTP、DNS、Telnet、SSH、 SMTP、HTTP、WWW、NFS
  • 6.表示层:JPEG、MPEG、ASII
  • 5.会话层:NFS、SQL、NETBIOS、RPC
  • 4.传输层:TCP、UDP、SPX
  • 3.网络层:IP、ICMP、ARP、RARP、OSPF、IPX、RIP、IGRP、 (路由器)
  • 2.数据链路:PPP、FR、HDLC、VLAN、MAC  (网桥,交换机)
  • 1.物理层:RJ45、CLOCK、IEEE802.3    (中继器,集线器,网关)

4层理论TCP/IP

  • 4.应用层:FTP、DNS、Telnet、SMTP、HTTP、WWW、NFS

  • 3.传输层:TCP、UDP、SPX

  • 2.网络层:IP

  • 1.数据链路: 以太网

2.IP协议

1.定义:

IP指网际互连协议,Internet Protocol的缩写,是[TCP/IP] 体系中的网络层协议

image.png image.png

Data,是我们实际要传输的数据,除了Data 以外的都可以交Header

  1. “尽最⼤努⼒的交付传输数据”,数据有可能丢失
  2. 不能保证顺序,可能我发送是 1,2,3,4 。但是接受可能是 2,4,3,1
  3. IP 协议是⽆连接的,在发送数据前,不需要先建立连接,直接发送

地址⻓度:

  • IPv4协议具有32位(4字节)地址⻓度
  • IPv6协议具有128位(16字节)地址⻓度;

3.UDP协议

属于传输层,用于扩展IP协议,在IP协议基础上,新增的源端口和目标端口,以解决数据包是发送到电脑里面的那个应用。

即:1个应用对应1个端口

3.TCP协议

TCP和UDP属于传输层协议

1.TCP:(基于连接)

如:打电话。

1.电话接通 2,互相通话 3,对话结束。 有顺序,可控 , 但效率底1

TCP是“全双工的字节流”

TCP(Transmission Control Protocol)传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层协议。TCP就是对于传输、发送、通信进行控制的协议。

2.UDP:(非连接)

如: 邮寄

1.是否收到 2,内容是否完整 3,顺是否正确 。 不可控, 但效率高

tcp头部信息

image.png

  1. 源端口和目的端口:用于寻找发端和收端的应用程序。这两个值加上IP首部的源端IP和目的端IP唯一确定一个TCP连接;

  2. 序号(Seq):标识从TCP发端向TCP收端发送的数据字节流,它标识在这个报文段中的第一个数据字节的序号。如果将字节流看作在两个应用程序间的单向流动,则TCP用序号对每个字节进行计数。序号是32bit的无符号数,序号到达2的32次方减一后又从0开始。SYN标志消耗一个序号;

  3. 确认序号(ACK):如果上次成功收到数据字节序号加一。只有ACK标志为1时确认序号才有效,ACK = Seq + 1;

  4. 报文长度/数据偏移:标识该TCP头部有多少个32bit(4字节),4比特最大表示15,TCP头部最长为60字节;

  5. 窗口大小:TCP流量控制的手段,告诉对方,我的TCP接收端缓冲区还能容纳多少个字节,这样对方能控制发送数据的速度;

  6. 校验和:由发送端填充,接收端对TCP报文执行CRC算法,以检验TCP报文段是否损毁。不仅校验头部,还包括数据部分;

  7. 紧急指针:也称为紧急偏移。紧急指针是一个正的偏移量,和序号字段的值相加表示最后一个紧急指针的下一字节的序号。是相对于当前序号的偏移。紧急指针是发送端向接收端发送紧急数据的方法;

  8. 标志位:

    • URG:表示紧急指针是否有效;
    • ACK:表示确认号是否有效,携带ACK标志的数据报文段为确认报文段;
    • PSH:提示接收端的应用程序应该立即从TCP接受缓冲区中读走数据,为接受后数据腾出空间;
    • RST:表示要求对方重新建立连接,携带RST标志位的TCP报文段称为复位报文段;
    • SYN: 表示请求建立一个连接,携带SYN标志的TCP报文段称为同步报文段;
    • FIN:通知对方本端要关闭了,带FIN标志的TCP报文段称为结束报文段;

9)TCP头部选项:头部选项是一个可变长的信息,这部分最多包含40个字节(前面20字节是固定的)

三次握手的流程

image.png

  1. 客户端发起请求,同时生成客户端标识SYN包 seq number=100,发送给服务端。

  2. 服务端 记录SYN包 seq number=100 是那个客户端发送过来,同时生成服务端标识ACK包 ack number=1,和新的SYN包 seq number = 200 返回给客户端。

  3. 客户端通过判断ACK包 ack number 与自己之前发送的SYN seq比较, 确认是自己上一次的请求,客户端进入establish状态,同时新增ACK包 ack =200 + 1 返回给服务端。

  4. 服务端接收到ACK包 ack number= 200+1 与上一次SYN seq = 200 判断,确定是上次的请求信息,证明是客户端已经应答,服务端也进入establish。

     三次握⼿的时间消耗为⾄少⼀个 RTT(Round Trip Time),即⽹路上⾄少⼀个来回,⼤部分时候这意味着 ⼏百毫秒的时间, 
    

为啥不是二次握手?

因为当客户端A发起第一次请求到服务端B,可能出现网络的阻塞,客户端以为失败了,又会重新发起第二次新的请求连接。第二次完成连接后,这时第一次请求又恢复正常,服务端为第一次请求一直进入等待状态并返回。但是这时客户端已经不处理第一次请求的。服务端的资源就会一直等待耗费。

ack和ACK区别

  • 小写的ack代表的是头部的确认号Acknowledge number, 缩写ack,是对上一个包的序号进行确认的号,ack=seq+1。
  • 大写的ACK,则是我们上面说的TCP首部的标志位,用于标志的TCP包是否对上一个包进行了确认操作,如果确认了,则把ACK标志位设置成1。

四次挥手

image.png

本质上是:客户端发起一次关闭请求,服务端应答。然后服务端发起一次关闭请求,客户端应答。

  1. 客户端主动发起FIN请求关闭,自己进入FIN-WAIT-1状态
  2. 服务端接受到FIN包,返回ACK 确认接收,自己进入CLOSE-WAIT关闭等待状态。
  3. 客户端接收到ACK,自己进入FIN-WAIT-2等待状态。
  4. 服务端再主动发起FIN包应答可以关闭,同时自己变成LAST-ACK状态,客户端接收到FIN,返回ACK确认,并进入TIME-WAIT状态。
  5. 服务端接受到 ACK后,确认状态后进入CLOSE状态
  6. 客户端等待一段时间后,也自动进入CLOSE。

为什么服务端要等一会,因为客户端和服务端有可能还在传输数据。要等服务器任务都传完了在告诉客户端可以关闭。

为什么 客户端要进入TIME-WAIT ,而不是直接CLOSE,因为客户端返回的ACK有可能丢包。这时候,服务端由于没有收到客户端的ACK,还会重新发送FIN要求确认。

传输原理

如何解决 丢包,乱序问题。

image.png

  1. 客户端把 本地完整的文件切割成多个小文件放到缓冲区
  2. 每次只拿出一部分数据请求服务端。在报文中描述文件的序列号+ 长度 + 数据内容。(注意客户端一次可以请求多个拆散的文件给服务端,服务端也只需回复一次ACK)
  3. 服务端接受后,返回确认的序列号+ 长度
  4. 客户端根据序号+长度,对比本地缓存,知道哪些还未请求,继续请求。
  5. 最后服务端把所有小文件根据报文,重新合并成原来的文件。

栗子

基于传输层tcp协议实现的聊天室

const net = require('net')
const chatServer = net.createServer()
const clientList = []
chatServer.on('connection',client => {
    client.write('Hi!\n')
    clientList.push(client)
    client.on('data',data => {
        console.log('receive:',data.toString())
        clientList.forEach(v => {
            v.write(data)
        })
    })
})
chatServer.listen(9000)

//测试代码
telnet localhost 9000

socket

Socket是一组编程接口(API) 是对TCP 或 UDP协议的封装和应用

websocket

websocket是应用层协议, 跟http是同等级别 传输层使用的是TCP

原理:

  1. 先使用http建立连接握手
GET /chat HTTP/1.1
Host: server.example.com 
Upgrade: websocket 
Connection: Upgrade  
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==  
Origin: http://xxxx.com
Sec-WebSocket-Protocol: chat, superchat 
Sec-WebSocket-Version: 
  1. 使用tcp发送数据

关键词学习:

  • TCP : Transmission Control Protocol传输控制协议
  • UDP : User Datagram Protocol 用户数据报协议
  • IP : Internet Protocol Address,互联网协议地址
  • HTTP : HyperText Transfer Protocol 超文本传输协议
  • Seq : Sequence Number
  • ACK:acknowledge 承认
  • SYN:Synchronize Sequence Numbers 同步序列编号
  • establish 建立

全双工:意味着,TCP的收发是可以同时进行的。亦即接收的时候可以发送,发送的时候也可以接收,两者互不冲突,可同时进行。