Linux 网络基础
Linux 网络基础
协议:一组规则。
1、分层模型结构:
- OSI七层模型:物理层、数据链路层,网络层、传输层、会话层、表示层、应用层
- TCP/IP 四层模型:网(链路层/网络接口层)、网络层、传输层、应用层
- 应用层:http、ftp、nfs、ssh、telnet... (用户)
- 传输层:TCP、UDP (内核)
- 网络层:IP、ICMP、IGMP (内核)
- 链路层:以太网帧、ARP (内核)
网络传输流程:(传输之前自上而下封装,接收后自下而上解封)
- 没有进行封装的无数据,不能在网络中传输
C/S 模型:client-server
优点:
- 缓存大量数据、提高传输效率
- 协议选择灵活,可定制、剪裁
缺点:
- 安全性差、不能跨平台、开发工作量大
B/S模型:browser-server
优点:
- 安全性好、跨平台、开发工作量较小
缺点:
- 不能缓存大量数据
- 只能采用固定协议(必须严格遵守HTTP)
2、网络通信协议
1)以太网帧和ARP协议
---链路层
目的地址-源地址:MAC地址
自己的源地址可以查,但是目的地址不知道,所以需要ARP请求,来获取目的MAC地址
-
ARP协议:根据IP地址获取MAC地址。
-
以太网帧协议:根据MAC地址,完成数据包传输
2)IP 协议
---网络层
-
版本: IPv4、IPv6 ---4位
-
TTL: time to live(生存时间) 设置数据包在路由节点中的跳转上限。每经过一个节点,该值-1,减为0的路由,有义务将该数据包丢弃
-
源IP: 32位 --- 4字节 192.168.1.108 ---点分十进制 IP地址(string)---二进制
-
目的IP: 32位 ---4字节
3)UDP 协议
---传输层
-
源端口号 ---16位 2^16 = 65535
-
目的端口号 ---16位
-
IP地址:可以在网络环境中,唯一标识一台主机
-
端口号:可以在网络的主机上,唯一标识一个进程(每个应用对应一个端口号)
-
IP地址+端口号:可以在网络环境中,唯一标识一个进程
4)TCP 协议
-
TCP数据包格式
- 源端口号 目的端口号---16位 2^16 = 65535
-
32序号、32确认序号
- 6个标志位
-
16位窗口大小(滑动窗口) 2^16 = 65535
TCP 通信时序:三次握手,四次挥手
①三次握手
- 主动发起连接请求端,发送 SYN 标志位,请求建立连接。携带序号、数据字节数(0)、滑动窗口大小。
- 被动接受连接请求端,发送 ACK 标志位,同时携带 SYN 请求标志位,携带序号、确认序号、数据字节数(0)、滑动窗口大小。
- 主动发起连接请求端,发送 ACK 标志位,应答服务器连接请求。携带确认序号
②四次挥手
- 主动关闭连接请求端,发送 FIN 标志位
- 被动关闭连接请求端,应答 ACK 标志位 ---半关闭完成
- 被动关闭连接请求端,发送 FIN 标志位
- 主动关闭连接请求端,应答 ACK 标志位 ---连接全部关闭
·
SYN,1000(0): SYN标志位/数据包包号:请求建立连接
ACK,1001:应答
并不是一次发送,一次应答,也可以批量应答
四次挥手的原因:半关闭
半关闭:不是关闭的套接字,而是关闭内核的缓冲区。(读数据/写数据)关闭的是写数据缓冲区
**mms: ** Maximum Segment Size,最大报文长度 选项值为1024
③滑动窗口
发送给连接对端,本端的缓冲区大小(实时),保证数据不会丢失。
作用:(TCP流量控制)防止数据丢失
④TCP状态
TCP状态时序图:
1:主动发起连接端:
CLOSE -- 发送SYN -- SEND_SYN -- 接收ACK、SYN -- SEND_SYN -- 发送ACK -- ESTABLISHED(数据通信态)
2:主动关闭连接端:
ESTABLISHED(数据通信态)-- 发送SYN -- FIN_WAIT_1 -- 接收ACK --FIN_WAIT_2(半关闭)-- 接受对端发送FIN -- FIN_WAIT_2(半关闭)-- 回发ACK -- TIME_WAIT(只有主动关闭连接方,才会经历此状态)-- 等2MSL时长(40s) -- CLOSE
3:被动接受连接请求端:
CLOSE -- LISTEN -- 接收SYN -- LISTEN -- 发送ACK、SYN -- SYN_RCVD-- 接收ACK -- ESTABLISHED(数据通信态)
4:被动关闭连接端:
ESTABLISHED(数据通信态)-- 接收FIN -- ESTABLISHED(数据通信态)-- 发送ACK -- CLOSE_WAIT(说明对端【主动关闭连接端】处于半关闭状态)-- 发送FIN -- LAST_ACK -- 接收ACK -- CLOSE
2MSL时长:一定出现在主动关闭连接请求端 --(和
TIME_WAIT
一样)保证最后一个ACK能成功被对端接收(等待期间,对端没收到我发的ACK,对端会再次发送FIN请求)
可以使用端口复用来解决2MSL等待的时间。
netstat -apn | grep 端口
端口复用:
在server代码的socket()和bind()调用之间插入:
int opt = 1; //设置端口复用
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, (void *)&opt, sizeof(opt)); //成功0,失败-1
半关闭:
通信双方中,只有一端关闭通信 ----
FIN_WAIT_2
1
close(cfd); //Ctr + C
2
shutdown(int fd, int how);
how: SHUT_RD 关读端
SHUT_WR 关写端
SHUT_RDWR 关读写
shutdown
在关闭多个文件描述符应用文件时,采用全关闭方法。close
只关闭一个
重点记忆:ESTABLISHED 、 FIN_WAIT_2 <--> CLOSE_WAIT、TIME_WAIT(2MSL)