Linux——网络_1(协议、模型、套接字)学习笔记


一、典型协议

应用层:常见协议有FTP/HTTP协议
传输层:常见协议有TCP/UDP协议
网络层:常见协议有IP/ICMP/IGMP协议
网络接口层:常见协议有ARP/RARP协议


  TCP传输控制协议(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

  UDP用户数据报协议(User Datagram Protocol)是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传输服务。

  HTTP超文本传输协议(Hyper Text Transfer Protocol)是互联网上应用最为广泛的一种网络协议。

  FTP文件传输协议(File Transfer Protocol)文件传输协议文件传输协议

  IP协议是因特网互联协议(Internet Protocol)

  ICMP协议是Internet控制报文协议<Internet Control Message Protocol)它是TCP/IP协议族的一个子协议,用于在Ip主机、路由器之间传递控制消息。

  IGMP协议是Internet组管理协议(Internet Group Management Protocol),是因特网协议家族中的一个组播协议。该协议运行在主机和组播路由器之间。

  ARP协议是正向地址解析协议(Address Resolution Protocol),通过已知的IP,寻找对应主机的MAC地址。

  RARP协议是反向地址转换协议,通过MAC地址确定IP地址。


二、网络应用程序设计模式

1.C/S模式

传统的网络应用设计模式,客户机(Client)/服务器(Server)模式。需要在通讯两端各自部署客户机和服务器来完成数据通信。

2.B/S模式

浏览器/服务器(Server)模式.只需要在一端部署服务器,而另一端使用每台PC都默认配置的即可完成数据通信。

3.两种模式优缺点

C/S模式
  优点:缓存数据,数据传输效率高;采用的协议相对灵活
  缺点:工作量大;对用户主机的安全性构成威胁

B/S模式
  优点:开发量焦小;不受平台限制
  缺点:网络应用支持受限;不能缓存数据,数据传输效率较低;采用的协议相对不灵活


三、网络分层模型

网络分层模型分为两种OSI 参考模型 和 TCP/IP 参考模型

  OSI 参考模型:从上到下共分为 7 层:应用层、表示层、会话层、传输层、网络层、数据链路层及物理层。这个 7 层的协议模型虽然规定得非常细致和完善,但由于过于复杂,在实际中却得不到广泛的应用。

  TCP/IP 协议模型:从一开始就遵循简单明确的设计思路,它将 TCP/IP 的 7层协议模型简化为 4 层,从而更有利于实现和使用

在这里插入图片描述

  • 网络接口层:负责将二进制流转换为数据帧,并进行数据帧的发送和接收。要注意的是数据帧是独立的网络信息传输单元。
  • 网络层:负责将数据帧封装成 IP 数据报,并运行必要的路由算法。
  • 传输层:负责端对端之间的通信会话连接与建立。传输协议的选择根据数据传输方式而定。
  • 应用层:负责应用程序的网络访问,这里通过端口号来识别各个不同的进程。

四、协议格式

1、 数据包的封装

在发送数据的时候,不能直接将数据发送给网络,必须要经过封装才可以成功发送。

封装的先后顺序为:应用层—>传输层—>网络层—> 网络接口层在这里插入图片描述
到达目标端的时候,再一次解封,拿出数据包。

数据包的封装是由内核来完成的。

2、TCP 面向连接的可靠数据包传递

三次握手协议:TCP 对话通过三次握手来初始化的。三次握手的目的是使数据段的发送和接收同步,并建立连接
  1.初始化主机通过向接受主机发送SYN建立连接请求。
  2.接受主机通过向初始化主机发送ACK回应同时发送SYN连接请求。
  3.初始化主机回应接受主机发送SYN建立连接请求。

在这里插入图片描述
  TCP 实体所采用的基本协议是滑动窗口协议。当发送方传送一个数据报时,它将启动计时器。当该数据报到达目的地后,接收方的 TCP 实体向回发送一个数据报,其中包含有一个确认序号,它意思是希望收到的下一个数据报的顺序号。如果发送方的定时器在确认信息到达之前超时,那么发送方会重发该数据报。

四次握手协议:用于关闭连接
  1.初始化主机通过向接受主机发送FIN来关闭连接请求。
  2.接受主机通过向初始化主机发送ACK回应,初始化主机关闭完成
    <此时处于半关闭状态,一端关闭,另一端未关闭>
  3接受主机通过向初始化主机.发送FIN来关闭连接请求。
  3.初始化主机回应接受主机发送ACK回应请求。接受主机关闭完成

五、NAT映射

NAT映射是数据包寻址的过程中的一个环节
NAT映射里面有一个映射表,表里记录的是,当前连接到路由器的终端局域IP地址和公网IP的对应关系

若一个路由器下面有多个终端,那么这些终端NAT映射后的公网IP相同,但是映射端口不同

六、打洞机制

   为了实现提高两个私有终端数据传输效率,提出了打洞机制。打洞机制完成后就不需要访问服务器可直接实现两个终端互连,但是,打洞机制必须由公网IP服务器来实现。
  由于路由器有自动屏蔽陌生IP的机制,所以两个终端不会直接连接,否则会被互相屏蔽掉;所以就需要先使用公网IP(服务器)连接来使两个终端路由器相互熟悉对方的IP,再实现直接连接(打洞机制)。

七、套接字

  在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程。"IP地址+端口号”就对应个socket。欲建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接。因此可以用Socket来描述网络连接的一对一关系。

IP地址:在网络环境中唯一标示一台主机
端口号:在主机中唯一标示一个进程
IP+port:在网络环境中唯一标示一个进程

在这里插入图片描述
  在网络通信中,套接字一定是成对出现的。一端的发送缓冲区对应对端的接收缓冲区。我们使用同一个文件描述符发送缓冲区和接收缓冲区。

1、网络字节序

TCP/IP协议规定,网络数据流应采用大端字节序,即低地址存高字节(高地址存低字节);
PC机通常采用小端字节序,即低地址存低字节(高地址存高字节)

因此在网络传输的时候,就需要网络字节序和主机字节序的转换
在这里插入图片描述

返回值
  成功:返回转换的字节序
  失败:返回-1

这里的 h 代表 host,n 代表 network,s 代表 short,l 代表 long。通常 16 位的 IP 端口号用 s 代表,而 IP 地址用 l 来代表。

2、IP地址转换函数

  通常用户在表达地址时采用的是点分十进制(字符型)表示的数值,而在通常使用的 socket 编程中所使用的则是二进制值,这就需要将这两个数值进行转换。

这里 inet_pton 函数是将点分十进制地址映射为二进制地址,而 inet_ntop 是将二进制地址映射为点分十进制地址。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、Socketaddr数据结构

首先介绍两个重要的数据类型:sockaddr 和 sockaddr_in,sockaddr_in比sockaddr更加细致化。

struct sockaddr {
				unsigned short sa_family; /*地址族*/
				char sa_data[14]; /*14 字节的协议地址,包含该 socket 的 IP 地址和端口号。*/
};
struct sockaddr_in {
				short int sa_family; /*地址族*/
				unsigned short int sin_port; /*端口号*/
				struct in_addr sin_addr; /*IP 地址*/
				unsigned char sin_zero[8]; /*填充 0 以保持与 struct sockaddr 同样大小*/
};

在这里插入图片描述
  但是在bind()函数、accept()函数、connect()函数内还是采用的sockaddr结构体,所以在采用sockaddr_in结构体时需要将其转化为sockaddr结构体类型。

4、Socket相关函数

socket()函数为通信建立一个连接端点

在建立了 socket连接之后,可对 socketadd 或 sockaddr_in 进行初始化,赋值IP和端口号,以保存所建立的 socket 信息。
在这里插入图片描述
参数2 【type】:这三种类型分别对应三种默认协议
  SOCK_STREAM 这个协议是按照顺序的、可靠的、数据完整的基于字节流的连接。这是一个使用最多的socket类型,这个socket是使用TCP来进行传输的。
  SOCK_DGRAM这个协议是无连接的、固定长度的传输调用。该协议是不可靠的,使用UDP来进行它的连接。
  SOCK_RAW socket类型提供单一的网络访问,这个socket类型使用ICMP公共协议。(ping、traceroute使用该协议)

参数3 【protocol】
  protocol传值0时,表示使用默认协议

bind()函数的作用是将参数sockfd和addr绑定在一起,使sockfd这个用于网络通讯的文件描述符监听addr.所描述的地址和端口。

在这里插入图片描述
  服务器程序所监听的网络地址和端口号通常是固定不变的,客户端程序得知服务器程序的地址和端口号后就可以向服务器发起连接,因此服务器需要调用bind绑定一个固定的网络地址和端口号。

listen()函数用于设置可以有多少个客户端可以同时与服务器建立连接

在这里插入图片描述
  典型的服务器程序可以同时服务于多个客户端,当有客户端发起连接时,服务器调用的accept()返回并接受这个连接,如果有大量的客户端发起连接而服务器来不及处理,尚未accept的客户端就处于连接等待状态,listen()声明sockfd,处于监听状态,并且最多允许有backlog个客户端处于连接待状态,如果接收到更多的连接请求就忽略。

accept()函数用于接受客户端的连接

在这里插入图片描述
  三方握手完成后,服务器调用accept()接受连接,如果服务器调用accept()时还没有客户端的连接请求,就阻塞等待直到有客户端连接上来。addr.是一个传出参数,accept()返回时传出客户端的地址和端口号。addrlen,参数是一个传入传出参数(value-result argument),传入的是调用者提供的缓冲区addr.的长度以避免缓冲区溢出问题,传出的是客户端地址结构体的实际长度(有可能没有占满调用者提供的缓冲区)。如果给addr.参数传NULL,表示不关心客户端的地址。

connect()函数用于客户端调用连接服务器

在这里插入图片描述

send()函数用于发送数据

在这里插入图片描述

recv()函数用于接收数据

在这里插入图片描述
  除了send和recvh函数外,还有sendto 和 recvfrom这两个函数,也可以发送和接收数据,可以用在 TCP 和UDP 中。当用在 TCP 时,后面的几个与地址有关参数不起作用,函数作用等同于 send 和 recv;当用在 UDP 时,可以用在之前没有使用 connect 的情况时,这两个函数可以自动寻找制定地址并进行连接。

服务器端和客户端使用 TCP 协议的流程图如图

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值