目录
一、OSI模型
应示会输网数物
二、TCP / IP 模型 (协议簇)
1、TCP/IP简介
(1)TCP/IP协议事实上是一个工业标准。
(2)TCP/IP协议指的是能够在多个不同的网络间实现信息传输的协议簇。
(3)该协议并不是只由 TCP 和 IP协议组成,而是由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇。只是TCP/IP 协议比较有代表性所以被称为TCP/IP协议。
(4)TCP/IP只有4层
2、自下而上了解TCP/IP协议: (网络接口和物理层)
- 物理层的主要设备就是中继器和集线器(交换机/路由)
- 封装成帧(在数据的前后分别加上开始《纠错以及修正》和结束的标记后便构成了一帧)
- 每一个数据链路层都规定了所能传输的一针数据中数据的长度上限称为最大传输单元(MTU)
- 透明传输(指的是不管数据的二进制是如何组合都应该能够正常传输而不会被误以为是某些控制的命令, 确保数据安全到达)
- 差错检测(在传输的二进制编码中加入适当的冗余度使得接收者可以发现在传输中是否出现了差错)
- TCP /IP 协议的数据包组成:
3、TCP/IP协议其他知识点
(1)特点:不局限于某一台主机中的各个进程,只要网络可以到达,就可以实现跨平台的进程通信。
(2)协议:想要实现在两个或多个平台中稳定通信,就需要遵守(达成)同一个协议。
(3)TCP协议包含两个方面
tcp传输协议:用来检测网络传输中差错的传输控制协议
ip 网际协议:专门负责对不同网络进行互联的互联网协议IP
(通俗的来说TCP是专门负责传输过程中的出错问题,一旦出现传输的问题TCP协议则会 介入处理,并把出错的数据包重新传输直到数据安全到达为止。而IP协议则是在网络中负责不同的 网络之间的通信,给网络中的每一台主机分配一个不同的IP地址)
三、基本知识点
1、socket——插座
是一个编程接口
是一个特殊的文件描述符
不仅仅局限于TCP/IP协议
面向连接 TCP(视频通话)
无连接 UDP (发微信消息)
很多的应用 都依赖于socket的接口例如FTP\TELNET等
2、为什么需要socket
(1)普通IO操作的过程: 打开文件 >> 读/写操作 >> 关闭文件( 在同一个机器上的两个程序可以简单的通过某一个相同的文件进行数据的交流和传输)
(2)Socket相当于从网络向进程传递数据和从进程向网络传递数据的门户。(在网络中两个进程完全不存在统一个机器打开方式)
3、什么是socket
独立于具体协议的网络编程接口
在OSI模型中主要位于会话层和传输层之间
Socket的类型:
- 流式套接字 (SOCK_STREAM) TCP :提供一个面向连接、可靠的数据传输服务,数据无差错、无重复、地发送并按顺序抵达。内设流量控 制,避免数据流淹没前面的数据。数据被查看时字节流,无长度限制。
- 数据报套接字(SOCK_DGRAM) UDP :提供无连接服务,数据包以独立数据包形式被发送,不提供无差错保证,数据有可能丢失或重复到 达,顺序发送可能会乱序接收
- 原始套接字(SOCK_RAW) :可以直接访问较低层次的协议例如 IP\ICMP
4、IP地址
- IP地址是网络中主机(电脑)的标识
- 在网络中主机想要与其他机器通信就必须拥有一个自己的IP地址
- IP地址为32位(IPV4)或者128位(IPV6)
- 每一个数据包都必须携带目的地址IP和源IP地址,路由器依靠此信息为数据包选择最优路由(路线)
5、端口号(用于区分计算机中某一个具体的程序)
- 用于区分一台主机中接收到的数据包应该转交给哪一个进程进行处理。
- TCP端口号与UDP端口号是相互独立的
- 端口号一般由IANA(Internet Assigned Numbers Authority) 统一管理
- 众所周知端口: 1 - 1023 (1-25之间为众所周知端口 , 256 - 1023 为UNIX系统占用) 何为总所周知端口其实就是早已固定号的端口比如80端口分配给WWW服务,21端口分配给FTP服务等
- 注册端口: 1024 -49151 分配给进程或者应用。这些端口号在还没有被服务器资源占用时,可以由用户的APP 动态注册获得。
- 动态端口号:49152 - 65535 被称为动态端口号他一般不固定分配某种服务而是动态分配的。一般可以使用 65000 以上的就可以随便用
6、字节序
- 小端序(Little-Endian):低序(低有效位)存储在低地址(起始地址),Intel\AMD 等采用的方式
- 大端序(Big-Endian) :高序(高有效位)存储在低地址 ARM采用的存储方式
为了避免在不同的处理器中收到的数据出现字节序带来的问题,因此网络中传输的数据必须按照网 络字节序来处理,也就是大端序。发送者在发送数据前必须先转换为网络字节序,而接收者需要在收 到网络中的数据时再转换为自己合适的主机字节序。
四、字节序转换API:
1、端口号的转换
头文件:
#include <arpa/inet.h>
函数原型:
uint32_t htonl(uint32_t hostlong); // 主机字节序到网络字节序 无符号长整型
uint16_t htons(uint16_t hostshort);// 主机字节序到网络字节序 无符号短整型
uint32_t ntohl(uint32_t netlong); // 网络字节序转为主机字节序 无符号长整型
uint16_t ntohs(uint16_t netshort); // 网络字节序转为主机字节序 无符号短整型
2、IP地址转换
头文件:
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
函数原型:
// 把cp指向的字符串转换为32位的网络字节序的二进制值存于inp中
// cp 点分十进制的网络地址的字符串 (IP地址)
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);