文章

linux网络编程-网络协议

协议:

​ 一组规则。

分层模型结构:

OSI七层模型: 物、数、网、传、会、表、应

TCP/IP 4层模型:网(链路层/网络接口层)、网、传、应

​ 应用层:http、ftp、nfs、ssh、telnet。。。

​ 传输层:TCP、UDP

​ 网络层:IP、ICMP、IGMP

​ 链路层:以太网帧协议、ARP

ARP请求

image-20240913145201405

c/s模型:

​ client-server

b/s模型:

browser-server

C/SB/S
优点:缓存大量数据、协议选择灵活,速度快安全性、跨平台、开发工作量较小
缺点:安全性、跨平台、开发工作量较大不能缓存大量数据、严格遵守 http

网络传输流程:

数据没有封装之前,是不能在网络中传递。

数据-》应用层-》传输层-》网络层-》链路层 --- 网络环境

以太网帧协议:

ARP协议:根据 Ip 地址获取 mac 地址。

以太网帧协议:根据mac地址,完成数据包传输。

IP协议:

img

版本: IPv4、IPv6  -- 4位

TTL: time to live 。 设置数据包在路由节点中的跳转上限。每经过一个路由节点,该值-1, 减为0的路由,有义务将该数据包丢弃

源IP: 32位。--- 4字节		192.168.1.108 --- 点分十进制 IP地址(string)  --- 二进制 

目的IP:32位。--- 4字节
  • IP地址:可以在网络环境中,唯一标识一台主机。
  • 端口号:可以网络的一台主机上,唯一标识一个进程。
  • ip地址+端口号:可以在网络环境中,唯一标识一个进程。

UDP:

img

​ 16位:源端口号。 2^16 = 65536

16位:目的端口号。

TCP协议:

img

16位:源端口号。	2^16 = 65536  

16位:目的端口号。

32序号;

32确认序号。	

6个标志位。

16位窗口大小。	2^16 = 65536 

image-20240913145312094

三次握手:

  1. 主动发起连接请求端,发送 SYN 标志位,请求建立连接。 携带序号号、数据字节数(0)、滑动窗口大小。
  2. 被动接受连接请求端,发送 ACK 标志位,同时携带 SYN 请求标志位。携带序号、确认序号、数据字节数(0)、滑动窗口大小。
  3. 主动发起连接请求端,发送 ACK 标志位,应答服务器连接请求。携带确认序号。

四次挥手:

  1. 主动关闭连接请求端, 发送 FIN 标志位。

  2. 被动关闭连接请求端, 应答 ACK 标志位。 ----- 半关闭完成。

  3. 被动关闭连接请求端, 发送 FIN 标志位。

  4. 主动关闭连接请求端, 应答 ACK 标志位。 ----- 连接全部关闭

滑动窗口:

img

发送给连接对端,本端的缓冲区大小(实时),保证数据不会丢失。

TCP状态时序图:

img

image-20240913145354119

结合三次握手、四次挥手 理解记忆。

  1. 主动发起连接请求端: CLOSE -- 发送SYN -- SEND_SYN -- 接收 ACK、SYN -- SEND_SYN -- 发送 ACK -- ESTABLISHED(数据通信态)

  2. 主动关闭连接请求端: ESTABLISHED(数据通信态) -- 发送 FIN -- FIN_WAIT_1 -- 接收ACK -- FIN_WAIT_2(半关闭)

     -- 接收对端发送 FIN -- FIN_WAIT_2(半关闭)-- 回发ACK -- TIME_WAIT(只有主动关闭连接方,会经历该状态)
    

    ​ -- 等 2MSL时长 -- CLOSE

  3. 被动接收连接请求端: CLOSE -- LISTEN -- 接收 SYN -- LISTEN -- 发送 ACK、SYN -- SYN_RCVD -- 接收ACK -- ESTABLISHED(数据通信态)

  4. 被动关闭连接请求端: ESTABLISHED(数据通信态) -- 接收 FIN -- ESTABLISHED(数据通信态) -- 发送ACK

     -- CLOSE_WAIT (说明对端【主动关闭连接端】处于半关闭状态) -- 发送FIN -- LAST_ACK -- 接收ACK -- CLOSE
    

重点记忆: ESTABLISHED、FIN_WAIT_2 <--> CLOSE_WAIT、TIME_WAIT(2MSL)

netstat -apn | grep 端口号

2MSL时长:

  • 一定出现在【主动关闭连接请求端】。 --- 对应 TIME_WAIT 状态。

  • 保证,最后一个 ACK 能成功被对端接收。(等待期间,对端没收到我发的ACK,对端会再次发送FIN请求。)

License:  CC BY 4.0