14、Socket编程
14.1、针对TCP应该如何Socket编程?
14.2、listen时候参数backlog意义?
Linux内核中会维护两个队列:
-
未完成连接队列(SYN 队列):接收到⼀个 SYN 建⽴连接请求,处于 SYN_RCVD 状态;
-
已完成连接队列(Accpet 队列):已完成 TCP 三次握⼿过程,处于 ESTABLISHED 状态;
现在通常认为backlog 是 accept 队列。
但是上限值是内核参数 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)广播地址用于什么?
- 广播地址用于在同一链路中相互连接的主机之间发送数据包。
- 广播地址有分为本地广播和直接广播
- 本地广播:在本网络内的广播