Socket编程、C/S和B/S架构、IPv4和IPv6、IP相关协议、Ping的作用与原理

14、Socket编程

14.1、针对TCP应该如何Socket编程?
14.2、listen时候参数backlog意义?

Linux内核中会维护两个队列:

  • 未完成连接队列(SYN 队列):接收到⼀个 SYN 建⽴连接请求,处于 SYN_RCVD 状态;

  • 已完成连接队列(Accpet 队列):已完成 TCP 三次握⼿过程,处于 ESTABLISHED 状态;

现在通常认为backlogaccept 队列。

但是上限值是内核参数 somaxconn 的⼤⼩,也就说 accpet 队列⻓度 = min(backlog, somaxconn)

14.3、accept发生在三次握手那个阶段?

在这里插入图片描述

  • 客户端的协议栈向服务器端发送了 SYN 包,并告诉服务器端当前发送序列号 client_isn,客户端进⼊SYN_SENT 状态;

  • 服务器端的协议栈收到这个包之后,和客户端进⾏ ACK 应答,应答的值为 client_isn+1,表示对 SYN 包client_isn 的确认,同时服务器也发送⼀个 SYN 包,告诉客户端当前我的发送序列号为 server_isn,服务器端进⼊ SYN_RCVD 状态;

  • 客户端协议栈收到 ACK 之后,使得应⽤程序从 connect 调⽤返回,表示客户端到服务器端的单向连接建⽴成功,客户端的状态为 ESTABLISHED,同时客户端协议栈也会对服务器端的 SYN 包进⾏应答,应答数据为server_isn+1;

  • 应答包到达服务器端后,服务器端协议栈使得 accept 阻塞调⽤返回,这个时候服务器端到客户端的单向连接也建⽴成功,服务器端也进⼊ ESTABLISHED 状态。

总结客户端 connect 成功返回是在第⼆次握⼿,服务端 accept 成功返回是在三次握⼿成功之后。

14.4、客户端调用了close,连接时断开的流程是什么?

在这里插入图片描述

  • 客户端调⽤ close ,表明客户端没有数据需要发送了,则此时会向服务端发送 FIN 报⽂,进⼊ FIN_WAIT_1状态;
  • 服务端接收到了 FIN 报⽂,TCP 协议栈会为 FIN 包插⼊⼀个⽂件结束符 EOF 到接收缓冲区中,应⽤程序可以通过 read 调⽤来感知这个 FIN 包。这个 EOF 会被放在已排队等候的其他已接收的数据之后,这就意味着服务端需要处理这种异常情况,因为 EOF 表示在该连接上再⽆额外数据到达。此时,服务端进⼊CLOSE_WAIT 状态;
  • 接着,当处理完数据后,⾃然就会读到 EOF ,于是也调⽤ close 关闭它的套接字,这会使得客户端会发出⼀个 FIN 包,之后处于 LAST_ACK 状态;
  • 客户端接收到服务端的 FIN 包,并发送 ACK 确认包给服务端,此时客户端将进⼊ TIME_WAIT 状态;
  • 服务端收到 ACK 确认包后,就进⼊了最后的 CLOSE 状态;客户端经过 2MSL 时间之后,也进⼊ CLOSE 状态;
14.5、Socket的三种类型
  • SOCK_STREAM (流式套接字) 提供可靠的、面向连接的通讯流。通过流式套接字发送了顺序的数据,数据到达时候的也是顺序的。数据流,一般是tcp/ip协议的编程;

  • SOCK_DGRAM(数据报套接字)无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠、无差错。数据包,是UDP协议的编程;

  • SOCK_RAW(原始套接字):用于一些协议的开发,功能强大,可以读写内核没有处理的IP数据包,而流套接字只能读取TCP协议的数据,数据报套接字只能读取UDP协议的数据。

14.6、Socket同步与异步

​ 主要针对C端,数据访问的时候进程是否阻塞

1、**同步:

​ 同步就是在C端发出了一个功能调用时,没有得到结果之前,该调用就不返回。必须一件一件事情做,前一件做完了才开始下一件。

​ 提交请求 -> 等待服务器处理 -> 处理完毕返回 ,在这个期间客户端不能干任何事

2、异步

​ 异步调用发出后,调用者不能立刻得到结果,那服务器通过状态、通知和回调来通知客户端。

​ 请求通过事件触发 -> 服务器处理(客户端依然可以做其他事情) -> 处理完毕

14.7、Socket阻塞和非阻塞

​ 主要针对S端,应用程序的调用是否立即返回

1、阻塞

​ 阻塞是指调用结果返回之前,当前线程会被挂起(CPU不会分给线程时间片,线程暂停运行),函数只有在得到结果后才会返回。

2、非阻塞

​ 要是不能得到结果,不会阻塞当前线程,就立即返回。

​ 忙轮询的方法,每隔一段时间查看是否有消息。

默认设置的套接字是阻塞的,可以通过调用ioctlsocket()函数,将套接字设置为非阻塞

15、C/S和B/S架构

15.1、C/S架构(客户/服务)

​ 一般是客户端进行用户界面/事物处理,服务器进行数据处理。一般是小范围里的网络环境,局域网之间通过专门服务器提供链接和数据交换服务。C/S一般面向相对固定并且相同区域,对信息安全的控制能力很强,一般高度机密的信息系统采用C/S结构适宜。C/S的客户端由于是本地程序,因此和本地硬件,程序的交互性很强,比如可以控制本机的其他程序,可以读写本地磁盘文件,可以与硬件交互。

15.2、B/S架构(浏览器/服务)

​ Web兴起后的一种网络结构模式,Web浏览器是客户端最主要的应用软件。这种模式统一了客户端,将系统功能实现的核心部分集中到服务器上,简化了系统的开发、维护和使用。建立在广域网上,不是专门的网络硬件环境,一般有操作系统和浏览器就行。B/S建立在广域网之上,对安全的控制能力相对弱,可能面向不可知的用户。B/S建立在广域网上,面向不同的用户群,分在地域,这是C/S无法做到的,与操作系统平台关系最小,正因为如此B/S很难和本地硬件、程序、文件进行交互。

16、IP

16.1、IP基本知识
1、IP的作用

​ 实现主机与主机之间的通信,也叫点对点通信。

2、IP与MAC

​ IP主要作用是实现主机之间的通信,而MAC的作用是实现直连的两个设备之间的通信;IP负责非直连的两个网络之间的信息传输。网络在传输过程中源地址和目标地址不会变化,但是MAC的地址和目标MAC一直在变化。

16.2、IP地址的基本知识
1、IP地址的定义

IP地址(IPv4)由32位整数来表示。

2、IP地址的分类

IP 地址分类成了 5 种类型,分别是 A 类、B 类、C 类、D 类、E 类。下图黄色部分为分类号,用以区分IP地址类别。

在这里插入图片描述

1)如何计算ABC分类地址最大主机个数?
  • 最大主机个数,就是看主机号的位数,比如C类,主机号是8位,即最大主机个数 = 2^8 - 2 = 254;
2)为什么要减2?
  • 因为在IP地址中有两个IP是特殊的,分别是主机号全为1和全为0地址。
    • 主机号全为 1 指定某个⽹络下的所有主机,⽤于⼴播
    • 主机号全为 0 指定某个⽹络
3)广播地址用于什么?
  • 广播地址用于在同一链路中相互连接的主机之间发送数据包。
  • 广播地址有分为本地广播和直接广播
    • 本地广播:在本网络内的广播,主
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值