网络基础
一、协议:
一组规则。
二、分层模型结构:
OSI七层模型: 物、数、网、传、会、表、应
TCP/IP 4层模型:网(链路层/网络接口层)、网、传、应
应用层:http、ftp、nfs、ssh、telnet。。。
传输层:TCP、UDP
网络层:IP、ICMP、IGMP
链路层:以太网帧协议、ARP
c/s模型:
client-server
b/s模型:
browser-server
C/S B/S
优点: 缓存大量数据、协议选择灵活 安全性、跨平台、开发工作量较小
速度快
缺点: 安全性、跨平台、开发工作量较大 不能缓存大量数据、严格遵守 http
三、网络传输流程(封装):
数据没有封装之前,是不能在网络中传递。
数据-》应用层-》传输层-》网络层-》链路层 --- 网络环境
数据包在不同协议层的称谓
数据层:段
网络层:数据报
链路层:帧
四、以太网帧协议(广播):
1.ARP协议:根据 Ip 地址获取 mac 地址(硬件地址)
2.以太网帧协议:根据mac地址,重新封装以太网帧,完成数据包传输
五、IP协议:
版本: IPv4、IPv6 -- 4位
TTL: time to live 。 设置数据包在路由节点中的跳转上限。每经过一个路由节点,该值-1, 减为0的路由,有义务将该数据包丢弃
源IP: 32位。--- 4字节 192.168.1.108 --- 点分十进制 IP地址(string) ---> 二进制
目的IP:32位。--- 4字节
IP地址:可以在网络环境中,唯一标识一台主机。
端口号:可以网络的一台主机上,唯一标识一个进程。
ip地址+端口号:可以在网络环境中,唯一标识一个进程。
六、UDP协议:
16位:源端口号。 2^16 = 65536 --- 可以描述的最大端口号是65535
16位:目的端口号。
七、TCP协议:
16位:源端口号。 2^16 = 65536 --- 可以描述的最大端口号是65535
16位:目的端口号。
32序号; (滑动窗口)
32确认序号。(滑动窗口)
6个标志位。
16位窗口大小。 2^16 = 65536
1. TCP通信时序(三次握手和四次挥手)
SYN, 1000(0), <mss 1460>:建立连接通信的标志位(标志位占一个字节),包号(所携带的数据的大小),<传递数据的上限>
mss(Maximum Segment Size): 最大报文长度
ACK 1001:应答(确认)的标志位,1001--表示1001以前的数据都收到了
FIN:完成的标志位
三次握手:
客户端:主动发起连接请求端,发送 SYN 标志位,请求建立连接。 携带序号、数据字节数(0)、滑动窗口大小。
服务端:被动接受连接请求端,发送 ACK 标志位,同时服务端发起连接请求,携带 SYN 请求标志位。携带序号、确认序号、数据字节数(0)、滑动窗口大小。
客户端:主动发起连接请求端,发送 ACK 标志位,应答服务器连接请求。携带确认序号。
四次挥手:
客户端:主动关闭连接请求端, 发送 FIN 标志位。
服务端:被动关闭连接请求端, 应答 ACK 标志位。 ----- 半关闭完成。
服务端:被动关闭连接请求端, 发送 FIN 标志位。
客户端:主动关闭连接请求端, 应答 ACK 标志位。 ----- 连接全部关闭
示例:socket连接画图
2.滑动窗口(TCP流量控制、批量回执)
指定缓冲区大小
发送给连接对端,本端的缓冲区大小(实时),保证数据不会丢失
win:滑动窗口大小
目的:防止数据丢失
3. TCP协议时序分析与代码的对应关系
4. TCP状态转换
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 端口号
:查看通信状态
5、 2MSL时长
一定出现在【主动关闭连接请求端】。 --- 对应 TIME_WAIT 状态。
保证:最后一个 ACK 能成功被对端接收。(等待期间,对端没收到我发的ACK,对端会再次发送FIN请求。)
6、 端口复用
int opt = 1; // 设置端口复用。
setsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, (void *)&opt, sizeof(opt));