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
优点:
- 缓存大量的数据(图片,特效,动画,声音等)
- 协议选择灵活
- 速度快,效率高
缺点:
- 安全性
- 开发工作量大
- 无法跨平台
B/S模型:
browser-server
优点:
- 安全性较好
- 跨平台
- 开发的工作量相对较小
缺点:
- 不能缓存大量的数据
- 必须严格遵守
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
TTL
:time 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()
两个函数均成功执行
主动发起连接请求端,发送SYN标志位, 请求建立连接。携带序号和确认序号,数据字节数(0),滑动窗口大小
被动接受连接请求端,发送ACK标志位, 同时携带SYN请求位。携带序号和确认序号,数据字节数(0),滑动窗口大小
主动发起连接请求端,发送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
– 发送SYN
– SEND_SYN
– 接收ACK, SYN
– SEND_SYN – 发送ACK
– ESTABLISHED
(数据通信态)
TCP主动关闭状态:
ESTABLISHED
– 发送SYN
– FIN_WAIT_1
– 接收ACK
– 1FIN_WAIT_2
(半关闭) – 接收对端发送FIN
– FIN_WAIT_2
– 回发ACK
– TIME_WAIT
– 等2MSL
时长 – CLOSE
TCP被动接收连接:
CLOSE
– LISTEN
– 接收SYN
– LISTEN
– 发送ACK,SYN
– SYN_RCVD
– 接收ACK
– ESTABLISHED
TCP被动关闭连接:
ESTABLISHED
– 接收FIN
– ESTABLISHED
– 发送ACK
– CLOSED_WAIT
(说明对端处于半关闭状态) – 发送FIN
– LAST_ACK
– 接收ACK
– CLOSE
重点:FIN_WAIT_2
: 主动关闭链接的一方, 发出FIN
受到ACK
以后进入该状态
2MSL时长
- 保证最后一个
ACK
可以被对端接收。(等待期间, 对端没接收到ACK
,可能会再次发送FIN
请求) - 一定出现在「主动关闭连接请求端」 —
TIME_WAIT
半关闭
通信双方中, 只有一端关闭通信。 — FIN_WAIT_2
处在半关闭的状态:
close
shutdown
shutdown函数
1 | 作用:关闭读端或写端 |
shutdown在关闭多个文件描述符引用的文件时, 采用全关闭的方法。close只关闭一个