网站首页 > java教程 正文
前言
TCP/IP协议
应用层
常见的几种的协议模板
xml
json
Protobuffer
小结
总结
传输层
UDP
UDP协议端格式
UDP的特点
基于UDP的应用层协议
TCP(重点)
TCP协议段格式
下面,我们就来介绍 TCP 里面的十个核心特性
第一个机制/特性:确认应答
二、超时重传
小结
下面再来看 第三个机制:连接管理(非常经典的面试题)
1、两个设备之间是如何建立连接的? - 三次握手
经典的面试
2、两个设备之间是如何断开连接的?- 四次挥手
小结
第四个机制:滑动窗口
五、流量控制
六、拥塞控制
七、延时应答
八、捎带应答
九、面向字节流 =》粘包问题
十、TCP的异常处理
1、进程终止
2、机器关机
3、 机器掉电/网络断开
总结
TCP vs UDP
经典面试题
网络层
先来看一下IP协议的报头结构
IP协议主要完成两方面工作
1、地址管理
2、路由选择
数据链路层
总结
补充:特殊协议
DNS
NAPT
前言
前面讲的 IO 和 网络初识,比较基础和简单,只是让大家喘口气。。。
网络socket编程,难度中等,大家仔细学,也是能学会的。
接下来这部分,也就是本篇博文。所讲得网络原理更加底层的东西,非常类似于多线程进阶,也就是为了应付面试的八股文。
前面的多线程进阶就是纯八股,而网络原理,其实还有比较清晰的脉络的,
相比前面还是比较好理解,但是也是有一定难度的。
TCP/IP协议
下面,以五层模型为主,我们开始从上往下的顺序,来认识这五层协议。
应用层
程序员最经常打交道的一层,其他四层都是操作系统,驱动,硬件,实现好了的。我们不需要去管。【除非你是做系统工程师,驱动开发工程师。。。】
在应用层这里,最最重要的事情,就是“设计并实现一个应用层协议”。
设计并实现一个应用层协议:就是自己去发明一个协议,并实现它。
但是不想要被这件事给唬住了,这其实是一个比较简单的事情,同时也是在工作中经常要做的事情。
常见的几种的协议模板
xml
xml 是属于一种比较老牌的数据格式了。
现在虽然也在用,但是用的越来越少了。
xml ,正是因为 它这个繁琐格式,导致它的热度逐渐就降低了。
因此,xml 现在很少作为 应用层协议的设计模板了。
现在使用 xml,主要是作为一些配置文件。
因为配置文件不需要网络传输,繁琐一点也无所谓,毕竟机械硬盘不值钱。
json
json 是当下最流行的一种 设计应用层协议 的数据格式。
我们以后在工作中是会经常用到这个。
Protobuffer
为了解决 json 的问题,Protobuffer 也就是应运而生。
Protobuffer 是一种二进制格式的数据。
在 Protobuffer 的 数据中,不再像 json 那样 包含 key 的 名字了,而是通过顺序以及一些特殊符号,来区分每个字段的含义。
同时再通过一个 IDL文件,来描述这个数据格式(每个部分是什么意思),IDL 只是起到一个辅助开发的效果,并不会真正的进行传输。
传输的只是二进制的纯粹的数据。
小结
这里面 json 的 应用范围 要比 Protobuffer 更广。
通常 开发效率 重于 运行效率的。
开发效率 包含 开发 与 调试。
如果线上环境出问题。
如果使用 json,出问题的请求和响应,一目了然。
如果使用 protobuffer,二进制数据,肯定是没有办法用眼去排查问题的。
为了解决这个问题,只有一个办法:为它专门写一个调试代码,用它去调试,这就更麻烦一些。
这就是我们所说的开发效率上的差异。
总结
设计应用层协议,是一件非常普通的事情,也是一件并不复杂的事情。
设计应用层协议,要做的工作
1、明确传输的信息(根据需求)
2、明确传输的模式(参考现有模板:xml,json,Protobuffer)
但是除此之外,业界也有一些现成的,已经被设计好,已经广泛使用了的应用层协议。
(也不是所有的时候,都需要从零设计,很多时候,可以直接基于现成的协议,稍加修改,稍加扩充,进行这种二次开发)
【类似于B栈鬼畜视频,就是典型的二次创作(二次开发),使用现成的视频进行修改剪辑的产物】
在 “现成的协议” 中,最知名的应用层协议,当属 HTTP。
随便打开一个任意的网页,其中的交互过程,都是通过 HTTP进行的。
再比如:打开手机 APP,比如饿了么,滴滴打车等等…
这时候,我们的手机APP 和 它的服务器之间交互过程,很可能也是 HTTP.
传输层
虽然传输层是操作系统内核实现的,程序员不需要直接和传输层打交道,但是传输层对我们来说仍然是意义重大的!!!
进行网络编程都需要用到 socket,一旦你调用 socket,代码就进入到传输层的范畴。
如果一切顺利,就还好。
一旦代码出现一些bug。为了解决理解这些bug,传输层的一些知识就是必要的。
传输层的协议,也是面试中特别爱考的,TCP协议、
下面正式开始。
传输层的协议有很多,其中最常见的就是 UDP 和 TCP 协议。
下面,我们就来学习 UDP 和 TCP 中的一些具体知识。
UDP
UDP协议端格式
下面正式开始。
传输层的协议有很多,其中最常见的就是 UDP 和 TCP 协议。
下面,我们就来学习 UDP 和 TCP 中的一些具体知识。
学习一个协议,很多时候就是在研究报文格式。
一个UDP数据报,具体长什么样子的?我们把它搞清楚了!
其实它这里面包含的一些功能特性,也就出来了!
DP的特点
网络编程(TCP 与 UDP协议)中讲了
基于UDP的应用层协议
NFS:网络文件系统
TFTP:简单文件传输协议
DHCP:动态主机配置协议
BOOTP:启动协议(用于无盘设备启动)
DNS:域名解析协议
TCP(重点)
TCP,即Transmission Control Protocol,传输控制协议。人如其名,要对数据的传输进行一个详细的控制。
TCP 是一个非常非常重要的协议,不光在实际开发中广泛使用,同时也是面试中的高频问题
TCP协议段格式
所以,我们整体看一下,发现:在真正理解TCP的一些机制之前,这里面的很多信息,以目前的知识储备是无法理解的。
因此,光看报头结构,还不够!!!
还得结合TCP这里面的一些具体的工作机制,进一步理解 TCP是怎么工作的。
然后,才能去明确 TCP报头,这里面都在做些什么。
这就是我们接下来要完成的工作。
下面,我们就来介绍 TCP 里面的十个核心特性
第一个机制/特性:确认应答
保证 TCP 可靠传输的核心机制。
在上篇博文网络编程(TCP 与 UDP协议)中,讲到:可靠性是指 发送方发出数据之后,能够知道对方有没有收到数据。
换个说法:
如果发送消息之后,能够知道对方 收到/没收到 数据,就是可靠的。
反之,发送消息之后,不知道对方 收到/没收到 数据,就是不可靠的。
所以,我们的TCP就是为了解决这个可靠性问题。
那么,问题来了:怎么解决的呢?怎么知道对方 收没收到数据呢?
关键就是:接收方 收到消息之后,就给发送方返回一个应答报文(ACK - acknowledge),表示自己已经收到了。
这就跟平常打电话一样,我说一句话,你回一声嗯,或者回一句话。
这样我们就能知道对方是听到我说的话。【知道对方收到了数据】
如果我们了一大堆,对面什么话都没说。
我们 就会认为对面可能没有听到,然后,就会问:你能听见吗?你怎么不说话?是信号不好吗?【知道对方可能没有收到数据】
这里的 “嗯/一句话 的回答”,就是确认应答的关键所在
总结了很多有关于java面试的资料,希望能够帮助正在学习java的小伙伴。由于资料过多不便发表文章,创作不易,望小伙伴们能够给我一些动力继续创建更好的java类学习资料文章,
请多多支持和关注小作,别忘了点赞+评论+转发。右上角私信我回复【03】即可领取免费学习资料谢谢啦!
原文出处:
https://blog.csdn.net/DarkAndGrey/article/details/124195991?spm=1001.2100.3001.7377&utm_medium=
distribute.pc_feed_blog_category.none-task-blog-classify_tag-1-124195991-null-null.nonecase&depth_1-utm_source=
distribute.pc_feed_blog_category.none-task-blog-classify_tag-1-124195991-null-null.nonecase
猜你喜欢
- 2025-04-30 多种负载均衡算法及其Java代码实现
- 2025-04-30 输入www.baidu.com背后经历了啥?说清楚这个,已经超过90%的人了
- 2025-04-30 优化MySQL:为什么你应该用 UNSIGNED INT 存储IP地址
- 2025-04-30 实模式下CPU如何获取数据及指令(实模式寻址方式)
- 2025-04-30 java基础都在这了,小主们拿去吧(java基础是指什么)
- 2025-04-30 盘点爬虫语言为何选择Python而不是Java
- 2025-04-30 搭载Dubbo+Zookeeper踩了这么多坑,我终于决定写下这篇
- 2025-04-30 深夜报警!10亿次请求暴击,如何用Redis找出最热IP?
- 2025-04-30 VPN技术(IPsec/L2TP/SSLVPN/PPTP)学习笔记
- 2025-04-30 74块钱一年的云服务器可以用来做什么?
你 发表评论:
欢迎- 最近发表
-
- 多种负载均衡算法及其Java代码实现
- 输入www.baidu.com背后经历了啥?说清楚这个,已经超过90%的人了
- 优化MySQL:为什么你应该用 UNSIGNED INT 存储IP地址
- 实模式下CPU如何获取数据及指令(实模式寻址方式)
- java基础都在这了,小主们拿去吧(java基础是指什么)
- 盘点爬虫语言为何选择Python而不是Java
- 搭载Dubbo+Zookeeper踩了这么多坑,我终于决定写下这篇
- 网络协议之TCP/IP协议(面试必考内容) - javaEE初阶 - 细节狂魔
- 深夜报警!10亿次请求暴击,如何用Redis找出最热IP?
- VPN技术(IPsec/L2TP/SSLVPN/PPTP)学习笔记
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)