程序开发 ·

网络编程基础

网络编程之前也是有所了解,但是一直都不够全面,所以一直想全面,系统的对计算机网络编程了解。于是就从网上和书籍中仔细的对网络基础进行了一些了解,因此今天对网络编程做个个人了解的总结。

从一个问题引入:你今天用手机拍了一张风情图片,想和心仪的女孩子分享下,我通过微信把图片发到心仪女孩子的手机中。在目前的手机的摄像头配置下,这张图片的大小和可能大的几M不等,目前网络数据包很可能无法一次性把图片数据发过去(以局域以太网使用的数据包最大是1518个字节,即一帧,它包含数据,目的地址,以及其他保证数据完整性的信息)。因此只能把你所想要分享的图片,分成不同的数据包,发送出去。网络中不可能只发送的你的图片,还有很多其他的需要交流的信息,因此可能会在网络堵塞,假如你的图片被分为编号1,2,3的数据包发送,图片手机可能有很多种路径到达对方的手机中,有的长,有的短,有的堵塞了。从而数据包很难按照顺序到达(2,1,3或者2,3,1的顺序)。即数据包乱序。而且网络中的各种部分各自决定数据包的缓存,转发,忽略,从而可能会导致数据包的丢失(即丢包)。还有传输过程中的瞬间故障可能会改变数据包的内容(位错误)

所以会有以下几个问题:

  • 1、数据包的大小和网络数据包的限制
  • 2、数据包丢失
  • 3、数据包乱序到达
  • 4、数据包内容被改变
  • 5、数据包延迟到达

为了解决以上问题,操作系统就使用了协议栈,协议栈分五层,如下:

  • 1、应用层
  • 2、传输层
  • 3、网络层
  • 4、链路层
  • 5、物理层

应用层:负责支持基于网路应用的的传输,如IM,邮件,文件等传输。使用多种协议,如http,smtp,ftp这些协议就是为了应用之间互相通信提供的一种协议。

传输层:负责应用层的消息在终端之间的传输,如处理(数据包乱序,分拆和组装数据包)。主要有TCP,UDP传输协议。TCP即传输控制协议,在两个端点之间为应用程序提供一个可靠的和有序的基于字节流的传输,是一种面向连接的协议。UDP即用户数据报协议,它是一种无连接的协议。两者之间最显著的差异就是TCP能保证数据的有序和可靠性,UDP则不提供这些。

网络层:传输层不知道如何将数据包从源路由发送到目的路由,而网络层在发送端负责把传输层的数据包发送到目的地址,在接收端把接收的数据包整理后传递给传输层,传输层再传递给应用层。这层通常用的就是IP协议,它包含数据包的格式和识别数据包向目的地传输的路由地址。
链路层:负责传输IP数据包,是IP数据包能从源路由到达目的路由,这层的协议是有:以太网,令牌环和IEEE 802.11等。

物理层:负责在物理上(光,电)将数据包d额位从一个节点传输到下一个节点。即使用物理介质来传输位。不同的物理介质有不用的物理层协议

一般作为程序员接触最多的也就是传输层和应用层,在应用层我们用的最多的就是Http协议,web,android,Ios,或者其他的应用程序都有http协议的身影,在传输层我们用的最的是TCP、UDP协议。

HTTP:http也叫超文本传输协议,在TCP之上的一种面向连接的协议。目前用的最广泛的http版本是http1.1,但也有很多的应用用到HTTP 2.0HTTP 2.0目前还在推广当中。那么为什么会要升级http协议呢?肯定是http1.1在网络快速发展的今天已经无法满足日益渐长得用户需求,以及http1.1本身也存在一些缺点。那么Http1.1的缺点有那些呢?

  • 1、http过于庞大。它包含太多的细节和可选部分
  • 2、http过多的可选项
  • 3、http未能充分的利用TCP
  • 4、http传输的大小和资源的数量对于目前的高速发展的互联网有点疲乏
  • 5、http对网络延迟异常敏感,对于目前需要低延迟,高网速的互联网不在适应
  • 6、http线头堵塞,如果前面的请求缓慢,会对后面的请求有影响。

以上就是目前http1.1有面临的一些问题。[详情请浏览]。HTTP2.0就是为了解决以上问题而产生的。那么http2.0如何对http1.1进行改进呢?

  • 1、降低协议的延迟
  • 2、解决线头堵塞
  • 3、防止主机要求更高的连接数量

http2改进方面:

  • 1、http2是二进制协议,从而是使用帧变得更加便捷
  • 2、多路复用的流
  • 3、提供优先级和依懒性,每个流都包含一个权重,来告诉端口那个流更重要。
  • 4、头压缩,http是一种无状态的协议,因此每个请求都会携带服务器的所有细节。

以上只是提供了HTTP2的几点优势,更多的关于http2的介绍还是请访问上面的连接。

https:http是以明文发送数据,不提供数据加密,因此安全性比较差,所以就有https的产生。简单点来说http是就是在http的协议上加入了SSL协议,为客户端和服务器提供数据加密,保证数据安全。http采用的是3次握手建立连接,但是https除了三次握手之外,还有需要9次握手的SSl,因此安全性是增加了但是创立连接的时间也相对变长了,对于服务器端的内存,cpu开销也会有相应的增加,不过为了安全性这点开销还是可以忽略不计的。关键是建立连接的速度比较慢!!
苹果公司已在17年1月份,对于app请求web数据都必须使用Https。可见https以后应该会成为web服务器的标配。

TCP和UDP的总结:

TCP:面向连接,拥塞控制,基于流,支持窗口和ACK,可靠,消息按序到达,缺点:建立和拆除连接负责,没有延迟和传输速率保障。

UDP:无连接的,无拥塞控制,基于数据报,无窗口和ACK,简单,适用于不易丢包和忽略丢报的环境。缺点:不可靠,乱序到达,可能导致网络堵塞,没有延迟和传输速率保障。

TCP三次握手和四次挥手:TCP连接是一种双全工的连接,连接建立后,两端可以同时发送和接收数据。TCP的连接建立采用的三次握手。

  • 1、客户端发送连接请求,
  • 2、服务器发送对连接请求的确认消息,
  • 3、客户端分配资源(数据窗口缓冲区,重传定时器等),并且发送确认消息,当服务器收到确认后,就会为此次连接分配资源

就此TCP的三次握手完成,连接创建,形象点的描述如下图所示(图片来自百度百科):

TCP拆除连接采用的四次挥手say byebye,具体的过程如下描述:

  • 1、客户端发送拆除连接的请求,服务器恢复一个ACK.
  • 2、服务端发送一个自己的拆除连接请求,客户端回复一个ACK,释放连接资源,服务端收到ACK后,释放与次连接相关的服务器资源,连接正式关闭

由此可以看出,服务器和客户端一来一回刚好4次。具体描述如下(图片来自百度百科):

以上是网络基础知识的一些简单总结,对于网络编程还有很多很多的知识,可以去了解,本文的基础知识来自《计算机系统系统架构与操作系统的高度集成》一书,关于更多的网络方面的知识可以去此书查看!我仅仅是略懂皮毛。一入IT深似海,且行且学习!!!!

参与评论