Linux C编程(六) 之 网络编程 (上)

网络协议栈

Linux C编程(六) 之 网络编程 (上)_第1张图片

网络基础

  • 在Linux网络编程中,网络协议主要分为五层
    应用层
    传输层
    网络层
    链路层
    物理层

  • TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。
    TCP/IP协议存在于OS中,网络服务通过OS提供,在OS中增加支持TCP/IP的系统调用——Berkeley套接字,如Socket,Connect,Send,Recv等

  • UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。

  • socket位于应用层和传输层之间的socket抽象层

  • 集线器 交换机 路由器
    集线器 只是电信号的放大和分流 电气层 物理层
    交换机 交换的是网帧, 链路层
    路由器 交换的是报文 网络层

  • 以下三个网段被用作内网网段
    192网段
    172网段
    10网段

  • tcp 报文格式

Linux C编程(六) 之 网络编程 (上)_第2张图片

  • IP 报文格式
    Linux C编程(六) 之 网络编程 (上)_第3张图片

  • MAC帧格式
    Linux C编程(六) 之 网络编程 (上)_第4张图片

  • 数据传输过程详解图
    Linux C编程(六) 之 网络编程 (上)_第5张图片

socket详解

  • socket套接字:
    socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。Socket就是该模式的一个实现, socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭).
    说白了Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

  • Linux C编程(六) 之 网络编程 (上)_第6张图片

    对于每个程序系统都有一张单独的表。精确地讲,系统为每个运行的进程维护一张单独的文件描述符表。当进程打开一个文件时,系统把一个指向此文件内部数据结构的指针写入文件描述符表,并把该表的索引值返回给调用者 。应用程序只需记住这个描述符,并在以后操作该文件时使用它。操作系统把该描述符作为索引访问进程描述符表,通过指针找到保存该文件所有的信息的数据结构。

tcp连接的三次握手和四次挥手

  1. 三次握手
  2. TCP协议通过三个报文段完成连接的建立,这个过程称为三次握手(three-way handshake),过程如下图所示。
    • 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
    • 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
    • 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
      一个完整的三次握手也就是: 请求—应答—再次确认。

Linux C编程(六) 之 网络编程 (上)_第7张图片
当客户端调用connect时,触发了连接请求,向服务器发送了SYN J包,这时connect进入阻塞状态;服务器监听到连接请求,即收到SYN J包,调用accept函数接收请求向客户端发送SYN K ,ACK J+1,这时accept进入阻塞状态;客户端收到服务器的SYN K ,ACK J+1之后,这时connect返回,并对SYN K进行确认;服务器收到ACK K+1时,accept返回,至此三次握手完毕,连接建立

  1. 四次挥手
    由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
    (1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送(报文段4)。
    (2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。
    (3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A(报文段6)。
    (4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。
    Linux C编程(六) 之 网络编程 (上)_第8张图片

tcp网络编程模型

Linux C编程(六) 之 网络编程 (上)_第9张图片

udp编程模型图

Linux C编程(六) 之 网络编程 (上)_第10张图片

不做过多文字描述…有错误之处欢迎指出。

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