Linux网络编程----基础知识总结

"Linux"我感觉仅从字面上讲就感觉不是很简单,千里之行,始于足下,接下来要开始有关Linux网络编程的学习了。我写的博客更多的是为了记录自己的学习知识点,有很多地方可能存在一些问题,毕竟水平低,敬请谅解。
今天看了好久有关Linux的书,对Linux有了一个比较笼统的了解。根据知乎里的推荐:
Linux网络编程----基础知识总结_第1张图片
关于Linux的基本知识点,自己也是学习了别人总结的知识点,个人感觉总结得比较全面:
程序员必备!非常全的Linux基础知识点,你知道多少?

互联网促成了TCP/IP协议的产生

  • 早期的ARPAnet使用网络控制协议(Network Control Protocol NCP),不能互联不同类型的计算机和不同类型的操作系统,没有纠错功能。
  • 1973年有Robert Kahn和Vinton Cerf两人合作为ARPAnet开发了新的互联协议。
  • 1974年12月两人正式发表第一份TCP协议详细说明,但次协议在有数据包丢失时不能有效的纠正

TCP协议分为两个不同的协议
用来检测网络传输中差错的循环数控制协议TCP(可靠传输)
专门负责对不同网络进行互联的互联协议IP(不可靠传输)

从此,TCP/IP协议诞生

什么是TCP/IP协议呢?

计算机与网络设备之间如果要相互通信,双方就必须基于相同的方法.比如如何探测到通信目标.由哪一边先发起通信,使用哪种语言进行通信,怎样结束通信等规则都需要事先确定.不同的硬件,操作系统之间的通信,所有这一切都需要一种规则.而我们就将这种规则称为协议 (protocol).

也就是说,TCP/IP 是互联网相关各类协议族的总称。

网络的体系结构

  • 网络采用分而治之的方法设计,将网络的功能划分为不同模块,以分层的形式有机的组合在一起
  • 每层实现不同的功能,其内部实现方法对外部其他层次来说是透明的。每层向上层提供服务,同时使用下层提供的服务
  • 网络体系结构即指网络的层次结构和每层所使用协议的集合
  • 两类非常重要的体系结构:OSI和TCP/IP

OSI开放系统互联模型

OSI模型相关的协议已经很少使用,但是模型本身却非常通用
OSI模型是一个理想化的模型,尚未有完整的实现
OSI模型有七层结构:
Linux网络编程----基础知识总结_第2张图片

事实上,TCP/IP协议是internet事实上的工业标准:
一共有四层:
Linux网络编程----基础知识总结_第3张图片
Linux网络编程----基础知识总结_第4张图片
至于为什么要分层呢?
把TCP/IP协议分层后,如果后期某个地方需要设计修改,那么就无须全部替换,只需要将需要改动的层变动。而且从设计上来说,也便得更加的简单。处于应用层上的应用可以只考虑分配给自己的任务,而不需要弄清楚对方在哪个地方又进行着怎样的传输

常见的协议

- 网络接口与物理层

MAC地址:48位全球唯一的用来作为网络设备的身份标识。在网络接口与物理层中主要的协议为:ARP/RARP。
ARP:主要通过其IP地址找到MAC地址;
RARP:通过MAC地址找到对应的IP地址
PPP协议:他是一种拨号协议(3G,4G,5G,GPS)

- 网络层(IP层)

IP协议:Internet protocal(分为IPV4和IPV6)
ICMP:Internet控制管理协议(ping命令)
IGMP:Internet分组管理协议(广播,组播等)

- 传输层

TCP:(Transfer Control protocol,传输控制协议 )提供面向对象连接的,一对一的可靠数据传输的协议。(数据无误、数据无丢失、数据无序性、数据无重复到达的通信)
UDP:(user Datagram Protocol,用户数据报协议):提供不可靠,无连接的尽力传输协议(是不可靠的无连接的协议,在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输
SCTP:(Stram Control Transmission Protocol:流控制传输协议),TCP的增强版,提供面向连接的,多对一或多对多的可靠数据传输协议

TCP和UDP
TCP和UDP都是传输层协议,但是两者具有不同的特效,同时也具有不同的应用场景。
Linux网络编程----基础知识总结_第5张图片
面向报文:
面向报文的传输方式是应用层交给UDP多长的报文,UDP发送多长的报文,即一次发送一个报文。因此,应用程序必须选择合适大小的报文。

面向字节流:
虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序看成是一连串的无结构的字节流。TCP有一个缓冲,当应该程序传送的数据块太长,TCP就可以把它划分短一些再传送。
关于TCP的三次握手与四次挥手:
第一次握手:建立连接。客户端发送连接请求报文段,并将syn(标记位)设置为1,Squence Number(数据包序号)(seq)为x,接下来等待服务端确认,客户端进入SYN_SENT状态(请求连接);

第二次握手:服务端收到客户端的 SYN 报文段,对 SYN 报文段进行确认,设置 ack(确认号)为 x+1(即seq+1 ; 同时自己还要发送 SYN 请求信息,将 SYN 设置为1, seq为 y。服务端将上述所有信息放到 SYN+ACK 报文段中,一并发送给客户端,此时服务器进入 SYN_RECV状态。

SYN_RECV是指,服务端被动打开后,接收到了客户端的SYN并且发送了ACK时的状态。再进一步接收到客户端的ACK就进入ESTABLISHED状态。

第三次握手:客户端收到服务端的 SYN+ACK(确认符) 报文段;然后将 ACK 设置为 y+1,向服务端发送ACK报文段,这个报文段发送完毕后,客户端和服务端都进入ESTABLISHED(连接成功)状态,完成TCP 的三次握手。

上面的解释可能有点不好理解,《图解HTTP》中的一副插图 形象的解释了以上的过程。
Linux网络编程----基础知识总结_第6张图片
当客户端和服务端通过三次握手建立了 TCP 连接以后,当数据传送完毕,断开连接就需要进行TCP的四次挥手。其四次挥手如下所示:

第一次挥手

客户端设置seq和 ACK ,向服务器发送一个 FIN(终结)报文段。此时,客户端进入 FIN_WAIT_1 状态,表示客户端没有数据要发送给服务端了。

第二次挥手

服务端收到了客户端发送的 FIN 报文段,向客户端回了一个 ACK 报文段。

第三次挥手

服务端向客户端发送FIN 报文段,请求关闭连接,同时服务端进入 LAST_ACK 状态。

第四次挥手

客户端收到服务端发送的 FIN 报文段后,向服务端发送 ACK 报文段,然后客户端进入 TIME_WAIT 状态。服务端收到客户端的 ACK 报文段以后,就关闭连接。此时,客户端等待 2MSL(指一个片段在网络中最大的存活时间)后依然没有收到回复,则说明服务端已经正常关闭,这样客户端就可以关闭连接了。
完整的过程如下:

- 应用层

网络访问协议:HTTP/HTTPS
邮件发送接收协议:POP3(收)/SMTP(发) 、IMAP(可接受邮件的一部分)、 FTP
Telnet/SSH:远程登录
嵌入式相关:
NTP:网络时钟协议
SNMP:简单网络管理协议(实现对网络设备集中式管理)
RTP/RTSP:用来传输音频的协议(安防监控)

TCP/IP协议通信模型

Linux网络编程----基础知识总结_第7张图片

网络封包是指数据包在网络中用指定的协议传输过程。
计算机只能识别二进制的数据,数据也是用二进制的方式存储在计算机中。要想实现多台计算机之间的通信,就要依赖一定的通信协议,如TCP/IP/HTTP等网络协议。为了区分每个协议,数据在传输过程中,会被用到的协议加上指定的格式。也可以理解为对数据的打包发送。例如:快递人员要把你购买的东西送到你家,就要先包装好,然后加上你的个人信息,最后送到你手中,整个过程称为封包。

Linux网络编程----基础知识总结_第8张图片

网络编程的预备知识

Socket简介:

  • 是一个编程接口
  • 是一种特殊的文件描述符(everything in Unix is a file)
    对它执行IO的操作函数,比如:read(),write(),close()等操作函数并不仅限于TCP/IP协议。
  • Socket代表着网络编程的一种资源
  • 面向连接(Transmission Control Protocol—TCP/IP)
  • 无连接(User Datagram Protocol-UDP和Inter-network Packet Exchange-IPX)

Socket类型:

流式嵌套字(SOCK_STREAM): (唯一对应着TCP)
提供一个面向连接,可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置流量控制,避免数据淹没慢的接收方。数据被看做字节流,无长度限制。
数据报嵌套字(SOCK_DGRAM): 唯一对应着UDP
提供无连接服务。数据报一独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收
原始嵌套字(SOCK_RAM):对应着多个协议,发送穿透了传输层)
可以对较低层次协议如IP、ICMP直接访问

IP地址

IP地址是Internet中主机的标识
- Internet中的主机要与别的机器通讯必须具有一个IP地址
- IP地址为32位(IPV4)或者128位(IPV6)
P)
- 每个数据包都必须携带目的的IP地址和源IP地址,路由器依靠此信息为数据包

  • IPV4表示形式:常用点分形式,如202.38.64.10,最后都会转换为一个32位的无符号整数
  • IP地址分类
    IPV4:采用32位的整数来表示
    IPV6:采用了128位整数来表示
    mobileIPV6:local IP(本地注册的)、room IP(漫游I
    特殊的IP地址:
    局域网:192.xxx.xxx.xxx 10.xxx.xxx.xxx
    广播IP:xxx.xxx.xxx.255,255.255.255.255(全网广播)
    组播IP:224.xxx.xxx.xxx~239.xxx.xxx.xxx

端口号

  • 为了区分一台主机接收到的数据包应该转交给哪个任务来进行处理,使用端口号来区别
  • TCP端口号与UDP端口独立
  • 端口号一般由IANA(Internet Assigned Numbers Authority)管理
  • 众所周知端口:1~ 2023(1~ 255之间为众所周知端口,256~1023端口通常由UNIX系统占用)[FTP:21,SSH:22,HTTP:80,HTTPS:469]
  • 注册端口:1024~ 49150
  • 动态或私有端口:49151~65535

字节序

不同类型CPU的主机中,内存存储多字节整数序列有两种方法,称为主机字节序(HBO):

  • 小端序(little-endian)-低序字节存储在低地址
    • 将低字节存储在起始地址,称为“little-Endian”字节序,Inter、AMD等
  • 大端序(big-endian)-高序字节存储在低地址
    • 将高字节存储在起始地址,称为“big-Endian”字节序,由ARM,Motorolo等所采用
  • 网络中传输的数据必须按网格字节序即大端字节序
  • 在大部分pc机上,当应用进程将整数送入Soket前,需要转化成网格字节序:当应用进程从socket取出整数后,要转化成小端字节序

IP地址常用的转换函数

in_addr_t inet_addr(const char *cp):
cp:点分形式的IP地址,结果是32位整数(内部包含了字节序的转换,默认是网络字节序的模式)
特点:
①仅仅适用于IPV4
②当出错时,返回-1
③此函数不能用于255.25.255.255的转换
inet_pton()/inet ntop():

#include 
int inet_pton(int af,const char*src,void *dat)

特点:
①适用于IPV4和IPV6
②能正确的处理255.255.255.255的转换问题
参数:
①af:地址协议族(AF_INET或INET6)
②src:是一个指针(填写点分形式的IP地址[主要是ipv4])
③dst:转换的结果给到dst
注意:
RETURN VALUE
inet_pton() return 1 on success(network address was successfully converted).

你可能感兴趣的:(Linux网络编程)