Linux网络编程笔记

第4章 程序、进程、线程

进程:是运行着的程序,操作系统资源分配的基本单位(内存,CPU时间片等),也是计算机运行的基本单位,有进程控制表PCB,系统通过PCB对进程进行调度。

应用程序:作为一个静态文件存储在计算机系统的硬盘空间中

  1. 进程是动态的,而程序是静态的
  2. 进程有一定的生命周期,而程序是指令的集合
  3. 一个进程只能对应一个程序,一个程序可以对应多个进程,

线程:为了节省资源而可以在同一个进程中共享资源的最小执行单位,有线程控制表TCB,TCB所表示的状态比PCB少得多,优点:系统资源消耗低;速度快;线程间的数据共享比进程间容易得多。

进程的产生方式有:fork()函数,system()函数,exec()函数等。

进程号:每个进程初始化时系统都会分配一个ID,用于标识进程,叫PID,

getpid():返回当前进程ID,getppid():返回父进程ID

fork()进程复制:以父进程为蓝本复制一个进程,其ID号和父进程ID号不同,只有内存与父进程不同,其他与父进程共享,只有在父进程或子进程进行修改后才重新生成一份。fork()的特点:执行一次返回两次,父进程中返回的是子进程的ID号,子进程返回0.

system()函数:调用shell的外部命令在当前进程中开始另一个进程,调用“/bin/sh-c command”执行特定的命令,阻塞当前进程直到command命令执行完毕。

exec()函数:在使用fork()函数,system()函数中,系统会建立一个新的进程,执行调用者的操作,原进程还存在,直到用户显式退出,而exec()函数会使用新进程代替原有的进程,系统会从新的进程运行,新进程的PID与原来进程的PID相同。

初始进程init:所有进程都有父子或兄弟,除了初始进程init,它是所有进程的祖先,其他进程都是由init进程直接或间接fork()出来的。

进程间的通信(IPC)主要方式:管道,共享内存,消息队列,信号量

管道:利用内核在两个进程之间建立通道,特点是与文件操作类似,仅仅在管道的一端只读,另一端只写,利用读写的方式在进程之间传递数据,管道的操作是阻塞性质的。

    进程创建管道,每次创建两个文件描述符来操作管道,其中一个对管道进行写操作,另一个描述符对管道进行读操作,在进程A中设置为读的管道文件描述符在进程B中要设置为写,反之。

共享内存:将内存中的一段地址在多个进程之间共享(在多个进程之间对内存段进行映射的方式实现内存共享),多个进程利用获得的共享内存的地址直接对内存进行操作。

消息队列:在内核中建立一个链表,发送方按照一定的标识将数据发送到内核中,内核将其放入链表后,等待接收方的请求;接收方发送请求后,内核按照消息的标识,从内核中将消息从链表中摘下,传递给接收方。消息队列是一种完全异步的操作方式。

进程的同步方式主要有:消息队列,信号量

信号量:是一个共享的表示数量的计数器,用于控制多个进程对共享资源的访问(生产者和消费者),是进程间同步的最主要方式。公共资源增加的时候信号量的值增加,消耗的时候,信号量的值减小,只有信号量的值大于0时,才能访问信号量所代表的公共资源。

信号:古老的进程间通信机制,用于在一个或多个进程间传递异步信号。可以由内核或其他进程产生、各种异步事件产生,如键盘中断。signal()函数用于截取系统信号,对此信号挂接用户自己的处理函数。

互斥锁:用来保护一段临界区,保证某一时间段只有一个线程在执行一段代码或访问某一资源。当线程执行到pthread_mutex_lock()函数时,如果此时该锁被另一个线程使用,当前线程阻塞,等待另一线程释放此锁。

第5章 TCP/IP协议族

ISO/OSI开放互联标准模型

Linux网络编程笔记_第1张图片

TCP/IP协议栈参考模型:应用层、传输层、网络层、数据链路层

物理层:给上一层提供访问接口,为IP协议和ARP协议提供服务、发送和接收网络数据报。

网络层:定义数据包的分组格式和协议—IP协议,因此又称IP层,将数据包分组路由,有路由、网际互联、拥塞控制等,网际控制报文协议ICMP,地址识别协议ARP。

IP协议

  1. 数据传送:将数据从一个主机传输到另一主机。
  2. 寻址:根据子网划分和IP地址,发现正确的目的主机
  3. 路由选择:选择数据在互联网上的传输路径
  4. 数据报分段:数据大于MTU时,将数据进行分段发送和接收组装

结构:头部(20字节)+数据

Linux网络编程笔记_第2张图片

总长度:该报文的长度(头部+数据),最大2^16-1字节

标识和片偏移:用于标识数据包,便于重组,片偏移指出该包位于正在重组的IP报文的偏移量

生存时间TTL:表示报文最多可以经过路由器数量。

协议类型:根据协议类型将数据包发往那个层的协议做相关的处理

校验和:使用循环冗余校验生成,保证IP帧的完整性

ICMP:报告网路上的某些出错情况,允许网际路由传输差错信息、时间、回显、网络信息等报文控制数据。位于IP字段的数据部分(插入其中,被IP报文传输)。

结构:

Linux网络编程笔记_第3张图片

类型:表示15种不同类型的ICMP报文

代码(8-15)图错了:用于对类型字段ICMP报文的详细规定

校验和:范围覆盖整个ICMP报文(头部和数据),校验方法和IP一致

ICMP报文类型由类型和代码决定,主要有:目的不可达、时间戳请求应答、回显请求应答、地址掩码请求应答。

ARP协议:32位IP地址和48位局域网地址之间执行翻译,建立IP地址和硬件地址的映射关系。在网际网中数据传输的目的地址是IP,在局域网中得知道设备的硬件地址才能向目的主机发送数据。ARP的高速缓存维持这种映射关系,存放最近IP地址到硬件地址的映射记录,每项记录生存时间为20分钟。实现方式:在以太网广播,查询目的IP地址,接收到ARP请求的主机响应请求方,将本机MAC地址反馈回去。

A Ping B过程

  1. 对ping指令,先判断是主机名还是IP地址,是主机名通过DNS域名解析将主机名换成IP地址。
  2. Ping程序向目的IP地址发送一个ICMP的echo包
  3. 由于A和B在同一个局域网,必须使用ARP协议将目标主机的IP地址转换为硬件地址,通过发送ARP请求广播来查找B的硬件地址
  4. B接收到ARP请求后,将本机硬件地址作为A的ARP应答
  5. 接着A发送ICMP数据包到主机B
  6. B收到A的ICMP包,发送响应包
  7. A接收B的ICMP响应包

Linux网络编程笔记_第4张图片

传输层:提供源主机和目标主机上的对等层之间可以进行会话的机制,有传输控制协议TCP,用户数据报协议UDP,

TCP:面向连接,可靠传输。利用IP层的机制在不可靠连接的基础上实现可靠连接,通过发送窗口控制、超时重发、分包等方法将一台主机发出的字节流发往其他主机。位于IP字段的数据部分(插入其中,被IP报文传输)。

  1. 字节流服务:传输的数据可视为无结构的字节流,
  2. 面向连接:传输前先建立连接(三次、四次)
  3. 可靠传输:基于校验和应答重发机制保证可靠性,如果校验后有误不发送应答,发送方在超时后会自动重发
  4. 缓冲传输:可以延迟数据传输,允许将数据积攒到一定数量进行传输
  5. 全双工
  6. 流量控制:滑动窗口机制

结构:

Linux网络编程笔记_第5张图片

端口号:用于确认发送端和接收端的应用程序

序列号:用来标识应用程序从TCP的发送端到接收端发送的字节流。当TCP连接时,发送一个序列号给接收端,连接成功后,这个序列号作为初始序列号ISN。确认号:接收方接收发送方发来的序列号后,+1作为确认号,发送再次发送时从确认号开始。

窗口尺寸:接收窗口大小,标识本机上TCP协议可以接收的以字节为单位的数目

选项:经常用于最大分段长度MSS,指明当前主机所能接收的最大报文长度。

三次握手

刚开始客户端处于 closed 的状态,服务端处于 listen 状态。然后

1.第一次握手:客户端给服务端发一个 SYN 报文,并指明客户端的初始化序列号 ISN(c)和想要连接的主机端口。此时客户端处于SYN_Send 状态。

2.第二次握手:服务器收到客户端的 SYN 报文后,以自己的 SYN 报文作为应答,并且也是指定了自己的初始化序列号 ISN(s),同时会把客户端的 ISN + 1 作为 ACK 的值发送回去,表示自已经收到了客户端的 SYN,此时服务器处于 SYN_REVD 的状态。

3.第三次握手:客户端收到 SYN 报文之后,会发送一个 ACK 报文,当然,也是一样把服务器的 ISN + 1 作为 ACK的值,表示已经收到了服务端的 SYN 报文,此时客户端处于 establised 状态。

服务器收到 ACK 报文之后,也处于 establised 状态,此时,双方已建立起了链接

Linux网络编程笔记_第6张图片

三次握手的作用:

确认双方的接受能力、发送能力是否正常

指定自己的初始化序列号,为后面的可靠传送做准备。

序列号 ISN(Initial Sequence Number)是固定的吗

ISN 是动态生成的,如果ISN是固定的,攻击者很容易猜出后续的确认号

ISN以便让对方知道接下来接收数据的时候如何按序列号组装数据。

四次挥手:

双⽅都处于 establised 状态,假如是客户端先发起关闭请求,则:

1.第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于FIN_WAIT状态

2.第二次挥手:服务端收到 FIN 之后,把客户端的序列号值 + 1 作为 ACK 报文的序列号值发送回去,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT状态。

3. 第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发送 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态。

4. 第四次挥手:客户端收到 FIN 之后,把服务端的序列号值 + 1 作为 ACK 报文的序列号值发送回去,此时客户端处于 TIME_WAIT 状态。需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态

5.服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态。

Linux网络编程笔记_第7张图片

UDP:无连接,不可靠,速度比TCP快,协议简单得多,对系统造成的负载低。不提供发送包的顺序,接收方不向发送方接收确认信息,出现丢包也无反馈。使用UDP的应用程序必须自己构建发送数据的顺序机制和发送接收的确认机制,来保证数据正确到达、数据顺序和发送数据一致。

Linux网络编程笔记_第8张图片

端口号:用于确认发送端和接收端的UDP端口

数据长度:头部和数据段的长度,单位字节

校验和:使用循环冗余校验生成

Linux网络编程笔记_第9张图片

应用层

最大传输单元MTU:IP层有一个要传输的数据比MTU大,在IP层数据要进行分片,使得每片小于MTU

IP地址=类别+网络标识+主机标识

类别:区分IP地址的类型

网络标识:表示主机所在网络

主机标识:标识主机在网络中的标识

A类地址(1~126):网络号占前8位,以0开头,主机号占后24位。分配给拥有大量主机的网络,一些大公司和因特网主干网络

B类地址(128~191):网络号占前16位,以10开头,主机号占后16位。分配给结点比较多的网络,区域网

C类地址(192~223):网络号占前24位,以110开头,主机号占后8位。分配给结点比较少的网络,校园网

D类地址(224~239):以1110开头,保留为多播地址。

E类地址(240~255):以1111开头,保留为今后使用

Linux网络编程笔记_第10张图片

子网掩码:便于网络设备快速寻址,区分本网段地址和非本网段地址。使用子网掩码可以得到一个IP地址的网络地址(类别),子网地址(网络标识),主机地址(主机标识)。可以通过比较两个IP地址分别对子网掩码进行与运算后的值来判断是否属于同一网段。

端口:为了方便多种应用程序,区分不同应用程序的数据和状态,引入了端口概念。如果是服务程序,则需要对某个端口进行绑定,这样客户端可以访问本主机上的此端口来与应用程序进行通信。IP地址只能对主机进行区分,而加上端口号就可以区分此主机上的应用程序。通过IP地址和端口号的组合可以确定网络上一个程序通路,端口号实际上是操作系统标识应用程序的一种方法。

1024以下的端口:保留端口,标准服务程序使用,Web服务器端口:80,电子邮件SMTP端口:25,文件传输FTP端口:20和21.

1024以上端口:用户应用程序可以使用。

小端字节序:将数据的最低字节放在内存的起始位置,内存地低位地址存放低位数据,x86架构

大端字节序:将数据的高字节放在内存的起始位置,内存地低位地址存放高位数据,PowerPC的UNIX系统

网络的字节序标准:大端字节序

字节序的转换:

Linux网络编程笔记_第11张图片

第6章

HTTP协议:Web的核心,在Web的客户端和服务器程序中得以实现,运行在不同系统上的客户端程序和服务器程序,通过交换HTTP消息彼此交流。

    HTTP协议只能在TCP协议的基础上进行传输,默认端口为80,其他端口也可用,WWW服务器运行时一直在TCP80端口监听。

过程:建立连接,发送请求信息,发送响应信息,关闭连接

建立连接:客户端打开一个套接字绑定在一个端口上,相当于建立了一个虚拟文件。

发送请求:客户端把请求消息发送到服务器的监听端口,完成提出请求动作

Linux网络编程笔记_第12张图片

Linux网络编程笔记_第13张图片

 

 

FTP:一种从一个主机向另一个主机传送文件的协议

Linux网络编程笔记_第14张图片

客户端:用户接口+客户端接口

服务器端:FTP服务器

客户端与服务器端都与文件系统进行交互

客户端到服务器下载文件步骤:

  1. 客户端通过FTP接口输入命令,让FTP客户端接口连接远方FTP服务器
  2. 连接后服务器要求用户输入账号,通过后进入正常的FTP下载过程
  3. 可在服务器上进行文件目录的转换,进入合适的目录进行相关操作
  4. 对目标文件下载需要特定的命令格式,服务器解析后与客户端进行文件传输
  5. 传输成功后客户端与服务器断开TCP连接

Linux网络编程笔记_第15张图片

FTP协议使用两个并行的TCP连接来传输文件,一个是控制连接,一个是数据连接。

控制连接:传送控制信息,如用户账号、改变目录、上传或下载,控制信息称为FTP的带外数据

数据连接:收发数据

在整个FTP的会话期间,FTP服务器必须维护连接中的用户状态。也就是说,FTP服务器必须把某个控制连接与某个用户对应起来,对当前用户的状态进行跟踪。这种对用户状态的维护限制了FTP的性能。

FTP工作模式:主动模式,被动模式

主动模式:(标准模式,PORT模式)在客户端连接后,告诉服务器数据连接客户端的端口

Linux网络编程笔记_第16张图片

被动模式:(PASV模式)客户端不发送PORT命令,而是PASV命令。FTP服务器接收到此命令后,在高端口上随机选取一个端口并将端口号告诉客户端,客户端在这个端口上与服进行传输。

传输方式: ASCII传输模式,二进制数据传输模式,区别:对传输数据是否进行了解释。

TELNET协议:远程登录协议,能够把本地用户所使用的计算机变成远程主机系统的一个终端,通过网络对服务器的资源进行访问和控制。

过程:

  1. 本地主机与远程主机建立TCP连接,用户必须知道远程主机的IP地址或域名
  2. 将本地终端上输入的用户名和口令及以后输入的任何命令或字符以NVT (NetVirtual Terminal)格式传送到远程主机。该过程实际上是从本地主机向远程主机发送一个IP数据报
  3. 将远程主机输出的数据转化为本地所接受的格式送回本地终端,包括输入命令回显和命令执行结果
  4. 本地主机撤销与远程主机进行的连接,这个过程是撤销一个TCP连接。

NVT格式传输:客户端将命令转换为NVT格式发送到服务器,服务器将NVT格式转换为系统需要的格式。服务器将数据格式转换为NVT格式,客户端将接收到的NVT格式数据再转换为本地的格式

你可能感兴趣的:(Linux网络编程笔记,linux)