1.物理层:网络通信的基础设施 运快递的公路
2.数据链路层 两个相邻的节点之间如何传输 两个集散点之间的传输
3.网络层 两个点之间的路径规划 物流公司规划快递的路径
4.传输层 两个点之间的通信(不考虑路径规划) 卖家发货 只考虑起点和终点
5.应用层 数据传输过去之后 具体如何使用 快递拿到之后如何使用
网络编程的主要工作 写应用层的代码 处理应用层的协议数据
从5到1往下传输 每次传输都会依次添加报头 就称为封装 QQ1发送
从1到5往上传输 每次传输都会解析去掉报头 QQ2接收
传输层提供两种协议
TCP:有连接,可靠传输,面向字节流,全双工
UDP:无连接,不可靠传输,面向数据报,半双工
可靠传输:数据对方有没有接收到,发送方有感知 打电话就是可靠的,可以知道对方有没有听到
不可靠传输:数据对方有没有接收到,不管,也不知道 微信就是不可靠的,不知道对方有没有看到我的消息
全双工:双向通信 一个管道 A->B B->A 同时进行
半双工:单向通信 一个管道 要么A->B 要么B->A 不能同时进行
UDP
UDP的Socket API
DatagramSocket和DatagramPaclet 核心类
socket类本质相当于文件 构造一个DatagramSock对象,相当于打开了一个内核中的socket文件
打开后就可以传输数据了
传输数据已 DatagramPacket为基本单位
InetSocketAddress类 IP地址+端口号
send发送数据 receive接收数据 close关闭数据
DatagramOacket 表示一个UDP数据报 UDP是面向数据报的协议
DatagramSocket
send、receive、close
DatagramOacket
DatagramSocket:对应一个socket文件
DatagramPacket:对应一个UDP数据报构造方法
1.只包含缓冲区 用于接收数据的时候,构造了一个空的数据报
2.包含缓冲区和一个InetAddress(客户端IP和端口号)
3.包含缓存区和服务器IP和服务器端口号
程序要进行网络通信,需要一个端口号
端口号相当于用来在网络上区分进行的身份标识符
分配端口号有 1.手动指定 2.系统自动分配
TCP
TCP两个核心类
ServerSocket 服务器使用socket
accept没有参数 返回值是一个Socket对象
功能是等待服务器和客户端建立连接,建立成功后则会把这个连接获取到进程中。接下来就通过Scoket返回的对象来进行交互
Scoket服务器和客户端都使用socket
通过socket对象就可以进行发送接收数据
socket内部包含了输入流对象(接收) 输出流对象 (发送)
ServerSocket只是在服务器这把使用,连接
accpet把操作系统内核建立好的连接拿到应用程序中
Socket:客户端和服务器都要使用,负责给这个客人提供服务
Socket对象中能获取到InputStream(接收)和OutputStream(发送)
服务器客户端工作流程
1.客户端读取用户输入
2.构造请求发送给服务器
3.读取请求并解析
4.根据请求计算响应
5.把响应数据返回客户端
6.读取服务器返回的响应
7.把响应数据展示给用户
应用层协议 自定义协议
DNS协议 域名解析 域名网址
sougou.com就是搜狗的域名
域名可以通过DNS系统自动转换成对应的IP地址
当电脑能使用qq,但打不开网页,多半是DNS挂了
8,8,8,8
114,114,114,114
明确传递的信息 数据的组织格式
分隔符
固定长度
xnm
json
protibuffer
传输层协议
UDP
UDP报头包含 源端口号、目的端口号、DUP长度、校验和均是2字节
UDP载荷 完整的应用层数据报
UDP长度是64kb 所以UDP一次只能传64kb的数据 缺陷
TCP
有连接 可靠传输 面向字节流 全双工
TCP机制
确认应答 延时重传 连接管理 滑动窗口 流量控制 拥塞控制 延时应答 捎带应答
前三个是保证了TCP的可靠性
滑动窗口提高传输效率的机制 本质就是把等待ACK的时间重叠 减少等待时间
但是和无可靠性的UDP相比,效率还是要差些。
TCP面向字节流
面向字节流指的是读写载荷数据的时候,是按照字节流方式读取的。
TCP本身仍然是一个一个数据报方式传输的
面向字节流核心问题是粘包问题
如何一个TCP连接里面只传一个应用数据报,不会发送粘包
如果一个TCP连接里,传输多个应用层数据报,这时候容易区分不清,哪个是整体的应用层数据,就会发生粘包问题
解决粘包问题就是在应用层明确包的边界
使用分隔符或约定长度等等。就是自定义协议
高频题
操作系统 进程和线程的区别
网络 TCP的三次握手和四次挥手
数据结构 哈希表
三次握手
A发送SYN
B发送SYN和ACK
客户端发送ACK
客户端发送 尝试建立连接的请求 syn,同步报文段
服务段发送 syn同步报文段和ack,确认报文段
客户端发送 ack
三次握手的意义在于保证可靠性的机制
在正式通信前,先确定好通信链路是否畅通,如果不畅通后续大概率丢包
为啥要握三次
握手三次是在验证通信双方的发送能力和接收能力是否正常
三次握手B返回ACK和SYN都是内核收到A的SYN立即返回的
协商重要参数
四次挥手
A发送FIN
B发送ACK
B发送FIN
A发送ACK
B发送ACK和FIN之间会有不知道的时间间隔。
B是代码人员调用close菜发送FIN
TCP状态
1.LISTEN服务器状态
服务器启动完毕,绑定端口成功(手机开机状态,随时可以接听电话)
2.ESTABLISHED
连接建立好了,可以进行后续通信。(电话号码接通,对方已接听)接下来可以进行说话了
3.CLOSE_WAIT
等待代码中调用close方法,发送FIN
4.TIME_WAIT
主动发起FIN的一方,会进入TIME_WAIT
主动一方收到FIN后,返回ACK进入TIME_WAIT
防止最后一个ACK丢失,当接受端返回ack等待一段时间后,发起端才断开连接
TCP和UDP区别
如何需要关注可靠性优先考虑TCP
如果传输单个数据报比较大 优先考虑TCP UDP上限是64kb
如果可靠性要求不高,但性能要求高 优先考虑UDP
如果需要广播 一个放松N个接收 如直播就优先考虑UDP
从浏览器中输入URL开始,最终看到网页,中间都发生了什么?
浏览器是客户端,输入URL就会访问对应的服务器
1.应用层角度:1.DNS解析 2.构造HTTP请求
2.传输层角度:TCP协议 1.三次握手建立连接 2.传输数据(确定应答,超时重传,滑动窗口,流量控制,拥塞控制)
3.网络层角度:网络数据报转发过程.一跳一跳的方式来转发(路由表匹配规则,下一跳相关内容)
4.数据链路层角度:以太网数据帧,mc地址,mac在转发过程中如何变化,MTU,MTU影响到的IP分包
5.物理层角度:上诉数据会转成“光信号”“电信号”进行编码,传输
6.总结:发送过程中,涉及到从上到下,封装,接收方,涉及到从下到上的分用。
客户端给服务器发送请求的过程
后面服务器根据请求计算响应,把响应按照类似的流程转发给客户端