目录
没有网络浏览器是没有页面的,这个时候可能会处于加载,那这个加载是不是正在进行tcp进行三次握手连接呢?
如果网页成功渲染完成,可以看到画面,网络这时突然断了,TCP会自动进行连接吗?
那么现在就理解了为什么使用socket套接字,需要bind服务端的ip和port了,对吧?
为什么不是http//127.0.0.1:80/s?key=value...这样的呢?->引出DNS解析!
那我们使用socket编程的时候,C程序就相当于是进程,而服务端的C程序需要绑定端口号和IP对吧?那这个端口号是用来标识当前进程的对吧?
那我们本地编程是不是就只是存留在应用层,没有向下涉及到传输层和网络层以及链路层,对吧?
如果我们使用socket这是传输字符串,没有涉及前端页面资源,也就没有使用到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是确定通信的进程;