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

目录

三次握手的目的是什么?

那浏览器显示画面前的加载是正在进行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的面向字节流,是不是按照字节的顺序传输的,并不是结构化传输的?

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

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


三次握手的目的是什么?

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

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

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是确定通信的进程;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值