linux 网络编程(1) --- 网络基础

网络编程

理论部分仅作大致的介绍, 具体的计算机网络相关的知识还需要去看书

协议

  • 一组规则, 用于描述数据传输的格式

常见的协议

传输层 TCP/UDP协议

应用层 HTTP, FTP协议

网络层 IP, IGMP协议

网络接口层 ARP, RARP协议

各类协议的功能

TCP协议:传输控制协议, 面向连接, 可靠, 基于字节流的传输层通信协议

UDP协议:用户数据报协议, OSI参考模型中一种无连接的传输层协议, 提供面向事物的简单不可靠信息传送服务

HTTP协议:超文本传输协议, 应用最广泛

FTP协议:文件传输协议

ICMP协议:inernet控制报文协议, 是TCP/IP协议族的一个协议,用于在IP主机,路由器之间传递控制信息

IGMP协议:是Internet组管理协议, 是因特网协议家族中的一个组播协议,用在主机和组播路由器之间

ARP协议:正向地址解析协议,用过已知的ip, 寻找对应主机的mac地址

RARP协议:是反向地址转换协议, 通过mac地址确定ip地址

分层模型结构

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

TCP/IP四层模型:网,网,传,应

OSI模型 TCP/IP模型
应用层
表示层 应用层(HTTP,FTP,SSH,NFS,TELNET
会话层
传输层 传输层(TCP,UDP
网络层 网络层(IP,ICMP,IGMP
数据链路层 网络接口层(链路层)(以太网帧协议,ARP
物理层

C/S模型:

  • client-server

优点:

  1. 缓存大量的数据(图片,特效,动画,声音等)
  2. 协议选择灵活
  3. 速度快,效率高

缺点:

  1. 安全性
  2. 开发工作量大
  3. 无法跨平台

B/S模型:

  • browser-server

优点:

  1. 安全性较好
  2. 跨平台
  3. 开发的工作量相对较小

缺点:

  1. 不能缓存大量的数据
  2. 必须严格遵守HTTP协议

网络传输流程

  • 数据没有封装之前, 是不能在网络中ch

以太网帧协议

ARP协议:用过已知的ip, 寻找对应主机的mac地址

目的地址 源地址 帧类型 硬件一系列信息(8字节) 发送端以太网地址 发送端IP地址 目的以太网地址 目的IP地址
ff:ff:ff:ff:ff:ff 自己的mac码 0806(表示为ARP协议) 自己的mac码 自己的ip ff:ff:ff:ff:ff:ff 目的ip地址

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

IP协议:

名词解释

版本:IPv4, IPv6

TTLtime to live 设置数据包在路由节点中的跳转上线, 每跳转一次, 该值-1, 当该值为0的时候, 路由器有义务将该数据包丢弃

源IP:32位,4字节 192.168.1.108 -> 点分十进制,string类型

目的IP:32位,4字节

端口号与IP地址

  • IP地址:可以唯一标识一台主机

  • 端口号:在网络的一台主机上唯一的表示一个进程

  • IP地址+端口号:在网络环境中,唯一的标识一个进程

UDP协议:

组成

  • 16位源端口号 -> (0-65535)
  • 16位目的端口号

TCP协议

组成

  • 16位:源端口号
  • 16位:目的端口号
  • 32位序号
  • 32位确认序号
  • 6个标志位
  • 16位窗口大小

TCP通信时序

也叫三次握手和四次握手

三次握手

https://zhuanlan.zhihu.com/p/53374516

第一次握手:客户端发送网络包,服务端收到了。这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。

第二次握手:服务端发包,客户端收到了。这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。 从客户端的视角来看,我接到了服务端发送过来的响应数据包,说明服务端接收到了我在第一次握手时发送的网络包,并且成功发送了响应数据包,这就说明,服务端的接收、发送能力正常。而另一方面,我收到了服务端的响应数据包,说明我第一次发送的网络包成功到达服务端,这样,我自己的发送和接收能力也是正常的。

第三次握手:客户端发包,服务端收到了。这样服务端就能得出结论:客户端的接收、发送能力,服务端的发送、接收能力是正常的。 第一、二次握手后,服务端并不知道客户端的接收能力以及自己的发送能力是否正常。而在第三次握手时,服务端收到了客户端对第二次握手作的回应。从服务端的角度,我在第二次握手时的响应数据发送出去了,客户端接收到了。所以,我的发送能力是正常的。而客户端的接收能力也是正常的。

若成功执行,则说明connect()accept()两个函数均成功执行

  1. 主动发起连接请求端,发送SYN标志位, 请求建立连接。携带序号和确认序号,数据字节数(0),滑动窗口大小

  2. 被动接受连接请求端,发送ACK标志位, 同时携带SYN请求位。携带序号和确认序号,数据字节数(0),滑动窗口大小

  3. 主动发起连接请求端,发送ACK标志位,应答服务器连接请求。携带序号和确认序号。

四次挥手

1)第一次挥手:客户端发送一个 FIN 报文(请求连接终止:FIN = 1),报文中会指定一个序列号 seq = u。并停止再发送数据,主动关闭 TCP 连接。此时客户端处于 FIN_WAIT1 状态,等待服务端的确认。

2)第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序号值 +1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT 状态。

此时的 TCP 处于半关闭状态,客户端到服务端的连接释放。客户端收到服务端的确认后,进入FIN_WAIT2(终止等待 2)状态,等待服务端发出的连接释放报文段。

3)第三次挥手:如果服务端也想断开连接了(没有要向客户端发出的数据),和客户端的第一次挥手一样,发送 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态,等待客户端的确认。

4)第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答(ack = w+1),且把服务端的序列值 +1 作为自己 ACK 报文的序号值(seq=u+1),此时客户端处于 TIME_WAIT (时间等待)状态

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

被动关闭连接请求端, 应答ACK标志位 – 半关闭完成

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

主动关闭连接请求端, 应答ACK标志位 – 关闭完成

滑动窗口

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

TCP状态

TCP主动发起状态:

CLOSE – 发送SYNSEND_SYN – 接收ACK, SYN – SEND_SYN – 发送ACKESTABLISHED(数据通信态)

TCP主动关闭状态:

ESTABLISHED – 发送SYNFIN_WAIT_1 – 接收ACK1FIN_WAIT_2(半关闭) – 接收对端发送FINFIN_WAIT_2 – 回发ACKTIME_WAIT – 等2MSL时长 – CLOSE

TCP被动接收连接:

CLOSELISTEN – 接收SYNLISTEN – 发送ACK,SYNSYN_RCVD – 接收ACKESTABLISHED

TCP被动关闭连接:

ESTABLISHED – 接收FINESTABLISHED – 发送ACKCLOSED_WAIT(说明对端处于半关闭状态) – 发送FINLAST_ACK – 接收ACKCLOSE

重点:FIN_WAIT_2: 主动关闭链接的一方, 发出FIN受到ACK以后进入该状态

2MSL时长

  1. 保证最后一个ACK可以被对端接收。(等待期间, 对端没接收到ACK,可能会再次发送FIN请求)
  2. 一定出现在「主动关闭连接请求端」 — TIME_WAIT

半关闭

通信双方中, 只有一端关闭通信。 — FIN_WAIT_2

处在半关闭的状态:

  1. close
  2. shutdown
shutdown函数
1
2
3
4
5
6
7
8
作用:关闭读端或写端
int shutdown(int sockfd, int how);
参数:
sockfd:待关闭的fd
how:指定被关闭的缓冲区
SHUT_RD:读端
SHUT_WR:写端
SHUT_RDWR:读端和写端

shutdown在关闭多个文件描述符引用的文件时, 采用全关闭的方法。close只关闭一个