网络编程
1. 网络分层模型
OSI七层模型 | TPC/IP四层模型 |
---|---|
应用层 | 应用层 |
表示层 | 应用层 |
会话层 | 应用层 |
传输层 | 传输层 |
网络层 | 网络层 |
数据链路层 | 链路层 |
物理层 | 链路层 |
2. 各层与协议关系
应用层
http ftp nfs 自定义
传输层
TCP UPD (端口号)
网络层
IP(主要) (主机)
链路层
ARP (mac地址)
2.1 链路层ARP协议
ARP协议作用:
借助IP获取mac地址
过程:
在一个局域网内,
A主机广播发送ARP请求包:源mac地址 | 目的mac地址(未知) | 源IP地址 | 目的IP地址
B主机收到后,发现是自己的IP,进行应答。
源mac地址 | 目的mac地址(从请求包中获取) | 源IP地址 | 目的IP地址(从请求包中获取)
2.2 网络层
IP
IP协议的作用:在网络环境中唯一标识一台主机
2.3 传输层
TCP/UPD
port——在一台主机上唯一标识一个进程
2.4 应用层
ftp/http/自定义
对数据进行封装,解封装
2.5 数据通信过程
封装
应用层——传输层——网络层——链路层
解封装
链路层——网络层——传输层——应用层
2.6 总结通信过程
- mac地址 (不需要用户指定) (ARP协议)IP——mac
- IP地址 (需要用户指定) —— 确定主机
- port端口号 (需要用户指定) —— 确定程序
3. socket 套接字
channel通信方式:
双向半双工
从左到右/从右到左,一边读一边写 (对讲机)
双向全双工
任意一边都可以同时读写 (电话) —— 实际上封装了两个通道,对外一个接口
单工通信
遥控器
4. TCP-CS
CS: 客户端/服务端
过程:
1. TCP服务器端listen(),指定IP+port,这里并不是监听链接。而是创建一个TCP/UPD的链接
2. 服务器端Accept(),阻塞监听客户端连接 ---> socket 通信
3. 客户端Dial(), ---> socket通信
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hVKOIFXS-1614969211975)(https://www.guangqian.club/myblog/Public/Admin/Js/editor/attached/image/20201127/20201127203026_56328.png)]
5. TCP通信过程
三次握手
第一次:客户端主动发起连接请求,SYN 2000(0), SYN表示标志位, 2000为自定义, 0表示内容大小
第二次:服务端被动接收请求, ACK 2001 SYN 7000(0), ACK表示应答标志位,在SYN的基础上+1,意思是2000之前的数据都可以接收到。发送ACK同时发送服务端的SYN标志位,表示服务端同意和客户端进行连接。
第三次:客户端向服务端发送响应,ACK 7001,意思是客户端可以接受服务端7000之前的所有数据。到此,三次握手完成——连接建立完成
四次挥手
第一次:主动关闭连接请求端:FIN 2000(0), 表示客户端发起关闭请求
第二次:被动关闭连接请求端:FIN 2001, 表示服务端确认接收到客户端关闭连接消息。至此,主动关闭端处于"半关闭"状态; 即客户端不再进行数据发送,只接收数据。
第三次:等待服务端数据发送完成,向客户端发送:FIN 5000(0), 表示服务端可以进行关闭。
第四次:最后客户端发送ACK 5001, 表示客户端确认服务端关闭。至此, 四次挥手完成。
为什么握手是三次,挥手是四次?
因为挥手时有 半关闭 状态,一次请求对应一次确认。 挥手时,客户端虽然发出关闭消息,但服务端可能存在数据还没发送完成,所以不能立刻发送FIN标志位。
建立连接时,被动方服务器端结束CLOSED阶段进入“握手”阶段并不需要任何准备,可以直接返回SYN和ACK报文,开始建立连接。
释放连接时,被动方服务器,突然收到主动方客户端释放连接的请求时并不能立即释放连接,因为还有必要的数据需要处理,所以服务器先返回ACK确认收到报文,经过CLOSE-WAIT阶段准备好释放连接之后,才能返回FIN释放连接报文。
连接
https://baijiahao.baidu.com/s?id=1654225744653405133&wfr=spider&for=pc