1、网络编程入门

1、TCP/IP协议

  • 特点:不会局限于一台主机中的各个进程,只要网络可以到达,就可以实现跨平台的进程通信

  • 协议:

    • 想要实现两个或者多个平台间的通信,就要遵守同一个协议
    • ARPA协议:ARPA(高级研究计划署)提出了一系列的网络协议,这些协议最终演化为现代互联网的基础。

      • 该协议不具备纠错功能
    • TCP/IP协议(协议簇):是一个协议簇,由多个协议组成,用于实现不同层次的网络通信。

      • tcp传输协议:用来检测网络传输中差错的传输控制协议
      • ip网际协议:专门负责对不同的网络进行互联和互联网协议IP

TCP是专门负责传输过程中的出错问题,一旦出现传输的问题TCP协议则会介入处理,并把出错的数据包重新传输直到数据安全到达为止。而IP协议则是在网络中负责不同的网络之间的通信,给网络中的每一台主机分配一个不同的IP地址

2、网络体系结构:

  • 1、网络体系结构指的是网络的层次结构和每一层所使用的协议的集合

  • 2、实现网络传输的功能非常复杂,从而采用了分而治之的设计方法,把网络的功能分化为不同的功能模块,以分层的形式有机的结合在一起

  • 3、每一层实现的任务和功能是不同的,其内部实现的方法对外部其他层来说是透明的,每一层都为上一层提供服务,同时使用下一层提供的服务

3、OSI模型与TCP/IP模型

①、OSI开放系统互联模型:

  • OSI模型的相关协议使用非常少,但是模型本身非常通用
  • OSI模型是一个理想化的模型,至今尚未完整的实现
  • OSI模型共分为7层

1、网络编程入门_第1张图片
1、网络编程入门_第2张图片
注意:

  • OSI模型并没有提供一个可以实现的方法,而是描述了一些概念,用来协调进程间通信标准的制定。即OSI参考模型并不是一个标准,而是一个在制定标准时所使用的概念性框架。

②、TCP/IP模型(协议簇):

  • TCP/IP实际上是一个工业标准
  • TCP/IP协议指的是能够在多个不同的网络间实现信息传输的协议簇
  • 该协议并不是只由TCP/IP组成,而是由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇。只是TCP/IP具有代表性,所以被称为TCP/IP协议。
  • TCP/IP只有4层
    1、网络编程入门_第3张图片
    1、网络编程入门_第4张图片

4、至上而下的了解TCP/IP协议

1、网络接口和物理层:

  • ①、物理层的主要设备就是中继器和集线器(交换机\路由)
  • ②、封装成帧(在数据前后分别加上开始《纠错以及修正》和结束的标志后,便构成了一帧)
  • ③、每一个数据链路层都规定了所能传输的一帧数据中的数据长度上限称为最大传输单元(MTU)
  • ④、透明传输(指的是不管数据的二进制是如何组合都应该能够正常传输而不会被误以为是某些控制的命令,确保数据安全到达)
  • ⑤、差错检测(在传输的二进制编码中加入适当的冗余度,使得接收者可以发现在传输中是否出现了差错)
  • ⑥、TCP/IP的协议包组成:
    1、网络编程入门_第5张图片
  • ⑦、数据的封装与传递过程:
    1、网络编程入门_第6张图片

5、网络编程储备知识:

Socket–插座

  • 是一个编程接口
  • 是一个特殊的文件描述符
  • 不仅仅局限于TCP/IP协议
  • 面向连接TCP(视频通话)
  • 无连接UDP(发微信消息)
  • 很多的应用都依赖于socket的接口,如:FTP\TELNET等

为什么需要Socket

  • 普通IO的操作过程:

    • 打开文件 >> 读写操作文件 >> 关闭文件
  • Socket文件的操作:

    • 在同一个机器上的两个程序可以简单地通过某一个相同的文件进行数据的交流和传输,但是如果在网络两个进程不存在一个机器上,需要如何打开。使用网络编程

什么是Socket

  • 独立于具体协议的网络编程接口
  • 在OSI模型中主要位于会话层和传输层之间
  • Socket的类型:

    • 流式套接字(SOCK_STREAM)TCP

      • 提供一个面向连接可靠的数据传输服务,数据无差错、无重复的发送并按顺序抵达。内设流量控制,避免数据流淹没前面的数据。
    • 数据报套接字(SOCK_DGRAM)UDP:

      • 提供无连接服务,数据包可以独立以数据包形式被发送,不提供无差错保证,数据有可能丢失或者重复到达,顺序发送可能会乱序接收
    • 原始套接字(SOCK_RAW)

      • 可以直接访问较低的层次协议,列如:IP\ICMP

Socket的位置:

1、网络编程入门_第7张图片

6、IP地址:

  • IP地址是网络中主机的标识
  • 在网络中主机想要与其他机器通信,就必须拥有一个他自己的IP地址
  • IP地址为32位(IPV4)或者128位(IPV6)
  • 每一个数据包都必须携带目的IP地址和源IP地址,路由器依靠此信息为数据包选择最佳的路由(路线)

表示形式

  • 点分形式:如192.168.124.1在传输过程中都会被转化为一个32位无符号的整数

端口号(用于区分计算机中某一个具体的程序):

  • 用于区分一台主机中接收到的数据包应该转交给哪一个进程进行处理
  • TCP端口号与UDP端口号是相互独立的
  • 众所周知端口:1-1023(1-25为众所周知端口, 256 - 1023为Unix系统占用)
  • 什么是众所周知端口:就是早已固定好的端口,比如:80端口分配给WWW服务,21端口分配给FTP服务等
  • 注册端口:1024 - 49151分配给进程或者应用,这些端口号在没有被服务器资源占用时,可以有用户的APP动态注册获得
  • 动态端口号:49152 - 65535被称为动态端口号,他一般不固定分配某种服务,而是动态分配的,一般65000以上的就可以随便使用
    1、网络编程入门_第8张图片
    1、网络编程入门_第9张图片

7、字节序:

不同的CPU主机中,内存存储的多个字节序列分为两种,这个称为主机字节序

  • 小端序:

    • 低序(地有效位)存储在低位置(起始位置),
  • 大端序:

    • 高序(高有效位)存储在低地址,ARM采用的存储方式

为了在不同的处理器中收到的数据出现字节序带来的问题,因此网络传输中的数据必须按照网络字节序来处理,也就是大端序。发送者在发送之前必须先转换为网络字节序,而接收者在接收到网络中的数据时在转换为自己合适的主机字节序

列如:

-      0x12345678
-      在小端中存放时:
-      12 34 56 78
     高地址 ----- 低地址

- 		0x12345678
- 		在大端中存放时:
- 		78 56 34 12
-    高地址 ----- 低地址

字节序转换API

  • 端口号的转换:

      头文件:
      			#include 
      函数原型:
      			uint32_t htonl(uint32_t hostlong);//主机字节序转换为网络字节序
      			uint16_thtons(uint32_t hostshort);//主机字节序转换为网络字节序
      			uint32_t ntohl(uint32_t netlong);//网络字节序转换为主机字节序
      			uint16_tntohs(uint32_t netshort);//网络字节序转换为主机字节序
    
  • IP地址转换

      头文件 :
      			#include 
      			#include 
      			#include 
      函数原型:
      			// 把cp指向的字符串转换为32位的网络字节序的二进制值存于inp中
      			int inet_aton(const char *cp, struct in_addr *inp);
      			
      			// 把cp指向的字符串转换为32位的网络字节序的二进制值并返回
      			in_addr_t inet_addr(const char *cp);
      			in_addr_t inet_network(const char *cp);
    
      			// 把in中的32位网络字节序的二进制地址转换为点分十进制的字符串
      			char *inet_ntoa(struct in_addr in);
    

你可能感兴趣的:(网络编程,网络,php,开发语言,linux,c语言)