前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >英语课突然悟了!!!网络传输,TCP,HTTP传输的流程以及问题解决方法!!!

英语课突然悟了!!!网络传输,TCP,HTTP传输的流程以及问题解决方法!!!

作者头像
啊QQQQQ
发布2025-03-06 08:48:41
发布2025-03-06 08:48:41
630
举报
文章被收录于专栏:C++C++

三次握手的目的是什么?

三次握手的目的是为了确保客户端和服务端的可靠连接;现在我们来谈谈三次握手的具体流程;

注意:三次握手的连接是处于网络双方信息通信的前期;

1.一次握手:客户端发送连接请求,这个时候客户端发送sep请求,以及一个序列号给服务端;

2.二次握手:服务端回应给客户端一个ACK回应,以及一个序列号;但同时呢为了节省时间,提高效率,所以服务端又会给客户端发送一个seq连接请求,以及一个序列号;

3.三次握手:客户端回应服务端发来的连接请求,即回应给服务端ACK,以及序列号;

注意:从上面的流程发现,似乎连接只涉及到传输层包括以下的网络层,并没有涉及到应用层;但是三次握手是TCP,是在传输层的,他的这一流程其实就是socket变成的connect,那我问你:socket编程代码编写是在哪里?是不是就是在应用层的进程中,而且在socket代码中连接中是要bind双方的网络ip和端口的,端口是干什么的?端口不就是用来标识应用层的进程的嘛!

总结:三次握手的目的是为了给应用层的进程进行网络信息传输打通通道!

那浏览器显示画面前的加载是正在进行tcp连接吗?

可能是,也可能不是;

我们都知道浏览器是需要网络的,这也就意味着浏览器上的内容并不是本地的,对吧,如果是本地的,那么就不需要进行通信,直接从本地获取就可以了;就行单机游戏一样,没有网络照样玩!

没有网络浏览器是没有页面的,这个时候可能会处于加载,那这个加载是不是正在进行tcp进行三次握手连接呢?

是,我们知道tcp连接服务端和客户端就是为了给双方建立可靠的网络传输通道;这个时候明显没有网络,那我肯定要建立连接啊!加载的过程就是正在建立连接;

那为什么又说不是呢?因为加载并不只是网路连接时会加载,对吧,想想我们打开一个网页(网络通畅的情况下)是不是有时候网页需要慢满才能显示出来!

没错!就是正在加载页面,我们打开的网页都有网址对吧,网址是什么?URL,那我问你?客户端是怎么访问服务端的,是不是就是通过URL,当然不只是URL,URL只是我们用户手动进行访问的方式,其中系统帮我们自动补全了请求方式,http版本等信息,然后打包通过网络协议栈发送给服务端;然后服务端会根据请求按照协议给出回应,这个回应就可能包含html,js,css,图片,视频等文件,所以你觉得我们平时访问的网页画面是什么,其实就是服务端的文件,经过浏览器的渲染展示出的画面,所谓"浏览器",就是浏览的嘛!对吧;

总结:加载转圈的时候不一定是在建立连接,还可能是在解析渲染服务段发来的资源文件等;

如果网页成功渲染完成,可以看到画面,网络这时突然断了,TCP会自动进行连接吗?

如果网页渲染成功了,说明之前的网络是正常的;如果网络突然断了,当然也就意味着客户端和服务端的连接也断开了;

那为什么画面还在?

回到上面的问题,我们说浏览器只是用来浏览的,我们看到的只是当时那一个时刻展示的画面,即便是网页是动态的画面依旧是那一时刻的,注意这里的那一时刻是那时候获取的资源,只要我们不访问,就不会向服务端发送请求,只要我们发送了请求,网断开,客户端无法连接,所以会显示网络断开的显示;

网络断开,TCP会自动进行自动连接,所以TCP为什么叫做网络可靠传输议;

重新理解SOCKET网络编程?

在说网络编程之前,我们先说我们平时写的C语言等程序;像这种程序我姑且称之为"本地编程"吧;

我们的本地编程是只可以在我们本地通信的,有血缘关系的进程可以,没有血缘关系的进程也可以进行通信,通信的方式有多种,比如匿名管道,有名管道,共享内存,消息队列等...

我们之前写的需要用到图片的程序,如果我们没有把图片放到进程工作路径下,发给别人,别人是打不开的,为什么,因为别人本地没有需要的图片资源,所以我们通常将需要的资源放在工作路径下然后打包给对方,但是这样已经不能算是进程间的网络通信,因为还是在本地独自进行的;

那我如果想把我的进程和别人的电脑的进程通信该怎么办呢?

那么这个时候就需要使用socket网络编程了,所以网络编程和"本地编程"的区别是什么?

是不是就是进程通信的对象在网络上不同啊!

那么现在就理解了为什么使用socket套接字,需要bind服务端的ip和port了,对吧?

ip是确定主机在网络中的位置,port是确定通信的进程;

所以socket其实就是进行网络编程的一套工具,我们使用的需要网络的软件都是用sokcet写的;

为什么服务端需要绑定ip和端口,而客户端不需要?

都需要!只是服务端是显式的绑定,而客户端是操作系统帮我们绑定的;

为什么?我们可以通过主次的关系看待这个问题;

1.真正需要服务的是客户端对吧,"你要东西,你还不主动点,什么便宜都让你占了!"

2.客户端和服务端在数量上是一对多的关系,如果客户端还需要手动绑定,已出现问题,用户又不会解决,所以是操作系统自动帮客户绑定的,并且是随机分配的;而服务端需要接收来自四面八方的请求,最好是绑定一个端口就固定下来,不然总是变化端口,客户找不到,找谁说理去?

所以我们作为客户端访问服务端,只需要知道对应的ip和端口就可以了;

比如:我们访问网址www.baidu.com对吧?这里就是其实就是解析了对应的ip和端口;然后访问了百度都多引擎的客户端!

为什么不是http//127.0.0.1:80/s?key=value...这样的呢?->引出DNS解析!

没有加密的网址是这样的比如我写Boost搜索引擎的时候,调用cpp-httplib库访问服务端就是这样的URL;

什么是DNS解析?他是干什么的?

DNS解析,简单来说就是一个解析,对吧!解析什么呢?解析的就是域名,什么是域名->ww.baidu.com;

解析后呢?变成什么了?

DNS解析域名后会将域名转化成对应的IP,所以现在知道为什么有些网址"深藏不漏"了吧?公司一般都会申请域名这样对自己的IP进行加密,防止有人恶意攻击;

那端口在哪呢?

端口是有我们的HTTP协议或者HTTPS协议自动填充的,嗯.就这样;

那我们使用socket编程的时候,C程序就相当于是进程,而服务端的C程序需要绑定端口号和IP对吧?那这个端口号是用来标识当前进程的对吧?

C程序就相当是进程,而服务端的C程序就相当于是服务端,我们使用TCP进行网络通信,服务端就是需要绑定自己的IP和端口号,所以这就是为什么客户端的我发送的string会在对应的服务端C程序接收到,这就是为什么那么多进程为什么不给你的原因,是因为"名花有主";

接下来谈谈应用层...

应用层->关键两个字"应用",应用是什么?应用是不是就是进程啊,对吧!我们的进程都是处在应用层的;只要是我们的程进程的网络通信都是源自应用层的!

所以我们使用socket仅仅只是字符串通信,有没有应用的数据传输?这个问题便不攻自破!!!

从应用层发送的数据传输都要贯穿整个网络协议栈!!!

那我们本地编程是不是就只是存留在应用层,没有向下涉及到传输层和网络层以及链路层,对吧?

对的,出应用层之外得协议栈都是为网络通信提供的,本地编程只是单进程或者多进程本地通信;

准确来说协议就是网络协议栈,网络<->协议,缺一不可;

如果我们使用socket这是传输字符串,没有涉及前端页面资源,也就没有使用到http协议,对吧?

我们使用socket进行简单的信息交流,仅仅只是传递的字符串,的确是没有用到http的;

我们先来谈谈http的应用场景->

常见的,http引用于浏览器访问,我们看到的浏览器画面,点击浏览器图片或者视频,以及搜索引擎,其实都应用到了http协议,我们通过访问URL,系统将[URL,请求方式,http版本]->报文(请求头),以及请求正文等内容一并打包给传输层这一打包过程就是按照http协议来的!

在应用层存在着很多的协议,并不是只有http一个,也不能把http就和应用层画等号,http是存在于应用层的协议,像他这样的当然不止一个!

那我们socket只传递串,是不是就不涉及http协议?

没有涉及http协议的url等信息,以及没有向引用层传递图片,视频等资源,所以是没有用到http的;

总结:并不是在应用层,就一定会用到http,这两个本身没有什么逻辑关系,应用层是计算机在逻辑上划分用户分区,而http是网络传输中定下的协议而已!

那图形化界面编程时制作的图片涉不涉及http呢?

不涉及,上面说过了,需要网络传输的资源需要体现在应用上的需要http协议,我使用QT制作的UI图画,并不是传递的,而是本地编程设计的,不属于网络传输资源范畴!所以不涉及!

那我QT的Button连接的槽函数是不是也不涉及http呢?

同样是属于本地编程,不涉及网络传输资源...

TCP的面向字节流,是不是按照字节的顺序传输的,并不是结构化传输的?

回答问题之前,我们不妨来谈谈什么面向字节流传输?

什么是字节流?字节流就是字节按照顺序排列,是有顺序的,而TCP按照字节流传输是不关心数据的具体含义的;

比如:我要传递两个32位整形,他可能是是按照3字节,5字节传递的,并不是根据4字节结构传递的!

那么这样就会产生两个问题->

1.数据是没有结构化的,那我怎么解析?

2.大小端存储可能会影响数据解析!

如何解决?---->序列化(Json,Protobuffer)

序列化是什么?

1.将数据转化成字符或者说是二进制;这样一来就可以解决大小端鵆问题,因为字符不存在大小端问题!!!

2.结构化解析问题,比如使用Json序列化后的数据是通过{}字符串键值对的形式存储,这样将数据结构化,接收方可以正确解析!!!

阁下说解决传输问题使用报头,其实是答非所问!

回答之前,我们不妨来谈谈什么是报头?以及报头在哪里,是干什么的?为什么要用报头?

首先,报头其实就是一个结构化,里面存储了很多个字段的信息,就类似于信息的大脑;当然肯定是包含了发源地和目的地,因为毕竟是传输;

那么报头通常用在什么场景呢?

报头通常是是用在tcp/io协议栈中,每个协议都有自己对应的报头和报文,而报头在网络传说中发挥了组织数据包内容和传输方向的作用;

那么,回到我们刚才的问题-->

网络传输中,tcp是面向字节流的,因此需要序列化;我们要解决的事传输过程中数据传输的形式,是解决应该怎么传输,而报头是什么?报头是我数据是什么,要传输哪里的问题!!!!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-03-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 三次握手的目的是什么?
  • 那浏览器显示画面前的加载是正在进行tcp连接吗?
    • 没有网络浏览器是没有页面的,这个时候可能会处于加载,那这个加载是不是正在进行tcp进行三次握手连接呢?
  • 如果网页成功渲染完成,可以看到画面,网络这时突然断了,TCP会自动进行连接吗?
    • 那为什么画面还在?
  • 重新理解SOCKET网络编程?
    • 那我如果想把我的进程和别人的电脑的进程通信该怎么办呢?
    • 那么现在就理解了为什么使用socket套接字,需要bind服务端的ip和port了,对吧?
    • 为什么服务端需要绑定ip和端口,而客户端不需要?
    • 为什么不是http//127.0.0.1:80/s?key=value...这样的呢?->引出DNS解析!
      • 什么是DNS解析?他是干什么的?
      • 解析后呢?变成什么了?
      • 那端口在哪呢?
  • 那我们使用socket编程的时候,C程序就相当于是进程,而服务端的C程序需要绑定端口号和IP对吧?那这个端口号是用来标识当前进程的对吧?
    • 接下来谈谈应用层...
    • 那我们本地编程是不是就只是存留在应用层,没有向下涉及到传输层和网络层以及链路层,对吧?
    • 如果我们使用socket这是传输字符串,没有涉及前端页面资源,也就没有使用到http协议,对吧?
    • 我们先来谈谈http的应用场景->
    • 那我们socket只传递串,是不是就不涉及http协议?
  • 那图形化界面编程时制作的图片涉不涉及http呢?
  • 那我QT的Button连接的槽函数是不是也不涉及http呢?
  • TCP的面向字节流,是不是按照字节的顺序传输的,并不是结构化传输的?
    • 那么这样就会产生两个问题->
    • 阁下说解决传输问题使用报头,其实是答非所问!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档