网络编程基础

来源:互联网 发布:音效制作软件 编辑:程序博客网 时间:2024/04/30 14:02

之前都零零碎碎的看了一些网络编程的基础,做的笔记也乱乱的。这次做个整理,把网络编程的基础知识复习一下,也是学习网络编程的新起点。

什么是网络编程:

指实现相互之间的通信和基本的网络应用原理性(协议)功能的程序,才能称为网络编程。

在通信时,双方必须按照一定的规则才能通信,也就是协议,常见的协议有TCPUDP等。

OSI七层模型与TCP/IP四层模型:

OSI

    应用层: 只听过连接网络的相应的应用程序(实际上就是API

    表示层: 将应用层传来的数据进行格式化转换,例如加密、解密等

    会话层: 控制主机通信链路(开放、关闭等操作)

    传输层: 数据的传输(以TCPUDP方式)

    网络层: 主机的IP寻址即数据的路由选择

    数据链路层:将数据进行打包,控制物理通信链路

    物理层: 将数据以电子信号的形式发出

TCP

    应用层

    传输层

    网络层

    网络链路层

 

*OSI七层模型只是网络通信的一个框架,实际上的实现都有相应的软件实现。

 

套接字(socket

套接字实际上就是一个端点,双方通信的实质就是双方套接字的通信。可以这么认为,要发出的数据通过网卡先传到套接字(当然是虚拟这样认为的)通过物理链路的发送传到另一台主机上,由该主机的套接字接收,然后在传递到网卡上。这样,主机间的通信就简化成双方套接字的通信了。套接字主要有两种,一种是流式套接字(对应TCP),一种是数据包套接字(对应UDP)。

 

结合上面可以这样认为:

主机A的应用程序发出一条数据a(应用层),然后将a进行一系列的格式化(表示层),打开主机的通信链路准备通信(会话层),选择要以哪种方式来发送此数据(传输层),根据IP找到主机BIP地址(网络层),将数据进行打包(数据链路层),将数据以电子信号发出(物理层)-------主机B接收

可以看出数据其实是经过一层层包装后才发送的,所谓包装,就是没传递一层就在数据加上一个包头,有的还会加上包尾。另一台主机接收后是由下往上一层层解包,到其应用层就看到了该数据。这可以看出在寄信时,写好信要先包装,然后寄出,收信人当然是先打开信封然后看到信的。

TCP/IP UDP/IP

上面出现的TCP/IPUDP/IP,那么什么是TCP/IPUDP/IP呢?

这是两种不同的传输方式,TCP/IP是面向连接的,传输数据是可靠、准确、可恢复的,在一些重要的通信中常采用该方式,它能保证发送的数据对方一定能收到。 UDP/IP是面向无连接的,传输数据时不可靠、不准确、不可恢复的,但是因为UDP比较简单,所以它的传输效率比较高,在一些视频、图片传输等就采用该方式。

连接与无连接:连接就是服务器一直处于等待的状态,等待客户端的请求,一旦有客户端请求的到来就接受并建立连接,此时双方才可以进行通信。无连接:客户端根据服务器的地址就可以直接进行通信,不用请求,服务器也不用处于等待,所以效率比较高。也就是说服务器要一直处于Listen等待客户端的Connect,然后才Accept进行通信。在编程中(TCP),服务器有两个socket,一个listen,一个accept,客户端有一个socket connect,服务器的listen套接字一直处于监听,当有请求到来时就产生一个accept套接字与客户端的connect套接字进行通信,而listen套接字依然处于监听状态。UDP下则不用进行监听、请求、接受操作。

网络字节顺序与主机字节顺序

在网络通信中,数据必须以一定的格式传输,如果不按照该规则,则可能接收不到想要的消息。

上微机原理课的时候看到一个大端序与小端序的说法,查了一下资料顺便扩展一下知识。

所谓大端序也就是我们说的网络字节顺序,就是将数据的高位存放在低地址端,低位数据存放在高地址端,这里又涉及到一些内存方面的知识了。举个例子:例如一个数据的地址是

0x 0A 0B 0C端序也就是将0x(也就是最高有效位)存放在低地址端,0C存放在高地址端。

读取数据的时候都是从内存的低地址端(也就是栈顶)开始读取的。我们可以举一个例子,以char buf[3]为例,在windows内存中(Intel处理器下)存放模型如下:

        栈底--------------------高地址端-----------------buf[0]

       

        -----------------------------------------------------buf[1]

 

        栈顶-------------------低地址端------------------buf[2]

 

这样网络字节存储下读取到的数据就是buf[3]。可见Intel是以小端序存储数据的。

小端序的存放规则与大端序的相反。

常用的API有:

htons()htonl():将主机字节顺序转换为网络字节顺序

ntohs()ntohl():将网络字节顺序转换为主机字节顺序

将数据以网络字节顺序存储后就可以保证数据发送的正确了。

 

C/S结构的三次握手与四次挥手

上面说到的主机AB,其实就是服务器与客户端,也就是C/S结构。

TCP中连接与断开不是一次就响应的,而是经过三次握手与四次挥手。

三次握手简单来说就是:请求->确认->再次确认

           客户端                                     服务器

      请求连接       ->>>SYN=1seq=X->>>     得到SYN=1的位码知道需要建立接

检查位码和确认包<<<-SYN=1 seq=Y ack=1 ACK=X+1 <<<-

                ->>>ack=1seq=Y+1->>>      检查确认包,建立服务

 

四次挥手:

客户端                                     服务器

      请求断开       ->>>FIN=1X->>>     得到FIN=1的终结包知道要断开连接

检查确认包和序号<<<-ACK=1 X+1 <<<-

  检查终结包    <<<-FIN=1<<<-     

                                   ->>>X+2 ->>>         确认断开

 

这些都只是基础知识,更深入的还要依靠以后的学习。也希望能向从事这方面的朋友多多学习。

原创粉丝点击