C/C++程序员面试宝典(五)

线程和进程
1、线程和进程的区别:
a.线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;
b.一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;
c.进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进程级的资源(如打开文件和信号),某进程内的线程在其它进程不可见;
d.调度和切换:线程上下文切换比进程上下文切换要快得多。
e.线程廉价,线程启动比较快,退出比较快,对系统资源的冲击也比较小。(这也是为什么常用多线程的原因)
C/C++程序员面试宝典(五)_第1张图片
TCP和UDP
2、TCP三次握手
TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。在TCP/IP协议中,TCP协议提供可靠的连接服务,连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号(seq)和确认号(ack)并交换TCP窗口大小信息。这就是面试中经常会被问到的TCP三次握手。
a.序列号seq
占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生,给字节编上序号后,就给每一个报文段指派一个序号,序列号seq就是这个报文段中的第一个字节的数据编号。
b.确认号ack
占4个字节,期待收到对方下一个报文段的第一个数据字节的序号,序列号表示报文段携带数据的第一个字节的编号,而确认号指的是期望接受到下一个字节的编号,因此挡墙报文段最后一个字节的编号+1即是确认号。
c.确认ACK
占1个比特位,仅当ACK=1,确认号字段才有效。ACK=0,确认号无效。
d.同步SYN
连接建立时用于同步序号。当SYN=1,ACK=0表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使用SYN=1,ACK=1.因此,SYN=1表示这是一个连接请求,或连接接收报文,SYN这个标志位只有在TCP建立连接才会被置为1,握手完成后SYN标志位被置为0.
e.终止FIN
C/C++程序员面试宝典(五)_第2张图片
a.第一次握手:建立连接。客户端发送连接请求报文段,将SYN(表示同步序号,用来建立连接)位置为1,序列号seq为x;然后,客户端进入SYN_SEND状态,等待服务器的确认;
b.第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置确认号ack为x+1(seq+1),并将ACK位置为1;同时,自己还要发送SYN请求信息,将SYN位置为1,seq为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;
c.第三次握手:客户端收到服务器的SYN+ACK报文段。然后将ack设置为y+1,此时的seq为x+1(相比于第一次握手的seq加1),向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。

3、TCP四次挥手
C/C++程序员面试宝典(五)_第3张图片
a.第一次挥手:主机1(可以是客户端,也可以是服务器端),设置seq,向主机2发送一个FIN报文段(双方的数据传送完成);此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;
b.第二次挥手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,ack为seq加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我知道你没数据要发送了;
c.第三次挥手:主机2向主机1发送FIN报文段,告诉主机1,我也没数据要发送了,同时主机2进入CLOSE_WAIT状态;
d.第四次挥手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。

为啥是三次握手、四次挥手?
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK是用来应答的,SYN是用来同步的,只有是三次握手建立连接,才能防止已失效的连接请求报文段突然又传送到了服务端,进而产生错误(client发送的请求报文可能由于延迟而在连接释放以后的某个时间才到达server)。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到Server端所有的报文都发送完了,Server端才能发送FIN报文,因此不能一起发送。故需要四步挥手。

4、UDP
UDP面向无连接,即发送数据前不需要建立链接。(常用于分组数据较少或广播通信以及视频通信等多媒体领域)

5、TCP和UDP对应的协议
TCP对应的应用层协议
a. FTP:定义了文件传输协议,使用21端口。
b. Telnet:一种用于远程登陆的端口,使用23端口,用户可以以自己的身份远程连接到计算机上,可提供基于DOS模式下的通信服务。
c. SMTP:邮件传送协议,用于发送邮件。服务器开放的是25号端口。
d. POP3:它是和SMTP对应,POP3用于接收邮件。POP3协议所用的是110端口。
e. HTTP:是从Web服务器传输超文本到本地浏览器的传送协议。
UDP对应的应用层协议
a. DNS:用于域名解析服务,将域名地址转换为IP地址。DNS用的是53号端口。
b. SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。
c. TFTP(Trival File Transfer Protocal),简单文件传输协议,该协议在熟知端口69上使用UDP服务

TCP/IP模型
C/C++程序员面试宝典(五)_第4张图片

你可能感兴趣的:(C/C++程序员面试宝典)