TCP/IP 科普部分 -- TCP/IP

TCP/IP 和以太网

TCP/IP 和以太网是独立发展的,以太网是当前最成功的局域网技术,TCP/IP 这是整个网络的标准协议;无论是局域网内常用的以太网还是 FDDI 光纤网络,甚至是 LTE 4G 网络都支持 TCP/IP 协议在其之上运行。

头部们

一个 HTTP 请求发送到服务器,需要在头部加上以太网头部、IP 头部以及 TCP 头部,这样才能保证这个歌HTTP 请求的二进制数据能够在复杂的网络环境中得到可靠的传输;

这三个头部在经过各种网络设备时会被大量修改以实现正确传输:以太网头部在经过交换机时并不会被修改,但是 IP 头部和 TCP 头部在经过交换机时会被修改。

在数据链路层中,包含以太网头部以太网尾部IP 头部TCP 头部,这些合起来称为以太网帧

IP 头部

在 IP 头部中每一行都有 32 位二进制数据,拥有 IP 头部特征的数据会被交换机、路由器、网卡等以太网设备当做有效的 IP 报文(又称“IP 数据报”)。

  • 总长度:界定了本次 IP 报文的长度
  • 源地址:本次 IP 报文是由哪个 IP 地址发出的
  • 目的地址:本次 IP 报文需要发给哪个 IP

原来发送一个 HTTP 请求时会带着自己的 IP 信息,所以在 nginx 或者通过代码层面得到的用户 IP 会不会就是用户在请求时的附带的自己 IP 呢?

TCP 头部


  • source port: 源端口
  • destination port: 目的端口
  • sequence: 序号,消息发送方用 sequence number 标记这组消息的顺序,接收方和发送方都使用 acknowledgment numbersequence number 来发送最近这组消息接收或者预期发送的序列。
  • data offset: 数据偏移,data offset 是存储了 TCP 头部长度,它指出了 TCP 报文段的数据起始处 距离 TCP 报文的起始处有多远。
  • reserved: reserved 目前为 0,保留字段。
  • flags: 标志位。
  • URG,紧急,当 URG = 1 时,表示紧急指针有效,代表此报文段中有紧急数据,应尽快传送,而不按原来排队顺序传送, URG 要与 urgent pointer 配合使用。
  • ACK:确认,当 ACK = 1 时,acknowledgement number 有效。一般称携带 ACK 标志的 TCP 报文段为「确认报文段」。TCP 规定,在连接建立后所有传送的报文段都必须把 ACK 设置为 1。
  • PSH:推送,当 PSH = 1 时,表示该报文段优先级较高,应该尽快推送给应用程序。
  • RST:复位,当 RST = 1 时,表示 TCP 连接中出现严重错误,需要释放并重新连接,一般称携带 RST 标志的 TCP 报文段为「复位报文段」。
  • SYN:同步,当 SYN = 1 时,表明这是一个请求连接报文段。一般称携带 SYN 标志的 TCP 报文段为「同步报文段」。在 TCP 三次握手中的第一个报文就是同步报文段,在连接建立时用来同步序号。对方若同意建立连接,则应在响应的报文段中使 SYN = 1 和 ACK = 1。
  • FIN:终止,当 FIN = 1 时,表示此报文段的发送方的数据已经发送完毕,并要求释放 TCP 连接。一般称携带 FIN 的报文段为「结束报文段」。在 TCP 四次挥手释放连接的时候,就会用到该标志。
  • window size:窗口大小,该字段明确指出了现在允许对方发送的数据量,它告诉对方本端的 TCP 接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。窗口大小的值是指,从本报文段头部中的确认号算起,接收方目前允许对方发送的数据量。例如,假如确认号是 701 ,窗口字段是 1000。这就表明,从 701 号算起,发送此报文段的一方还有接收 1000 (字节序号是 701 ~ 1700) 个字节的数据的接收缓存空间。
  • checksum:校验,由发送端填充,接收端对 TCP 报文段执行 CRC 算法,以校验 TCP 报文段在传输过程中是否损坏,如果损坏将丢弃。校验范围包括头部和数据两部分,这也是 TCP 可靠传输的一个重要保障。
  • urgent pointer:紧急指针,仅在 URG = 1 时才有意义,它指出本报文段中的紧急数据的字节数。当 URG = 1 时,发送方 TCP 就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍是普通数据,因此,紧急指针指出了紧急数据的末尾在报文段中的位置。

由 TCP/IP 头部可以看出, IP 数据报更像是火车🚄,载着人们(数据)前往某个车站(IP 头部中目的地址),而火车进入车站哪一个入口是由 TCP 头部中目的端口决定的,当然在进入车站时会火车会附带将本次列车信息,但这只是比喻,TCP/IP 中还要进行三次握手,火车哪能倒车之类的。

TCP 头部中有着目的端口,规定访问哪个端口,那对应的 UDP 会不会也是有目的端口。毕竟以太网设备需要知道它们想要访问哪个端口。可见无论是计算中协议、语言都是构建出一套规范,目的是为了更好地数据交互或者构建应用,并且每层负责的任务都是很明确、少量的。

UDP 头部

  • 同样地,UDP 头部确实也是有源端口号、目的端口号

TCP UDP 区别

TCP: 面向连接、传输可靠(保证数据正确性、顺序性)、用户传输大量数据、速度相对较慢,建立连接(三次握手)以及断开(四次挥手)需要的开销相对较高(时间、系统资源)。

UDP:面向费连接、传输不可靠、用于传输少量数据、速度快。