Linux-C 网络编程TCP整理API及面试问题
TCP概述1
1.TCP协议分成了两个不同的协议:
·用来检测网络传输中差错的传输控制协议TCP
·专门负责对不同网络进行互联的互联网协议IP
2.TCP/IP与OSI是两类非常重要的体系结构
3.两种体系结构参考模型
面试相关问题
1.为什么连接的时候是三次握手,关闭的时候却是四次握手?
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK2报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
2.TCP和UDP的区别?
TCP—传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
UDP—用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快
3.TCP和UDP的优缺点?
TCP缺点:
三次握手四次挥手,传输更多包,浪费一些带宽。
为了进行可靠通信,双方都要维持在线,服务器server可能出现非常大的并发连接,浪费了 系统资源,甚至会出现宕机。
确认重传也会浪费一些带宽,且在不好的网络中,会不断的断开和连接,降低了传输效率。
UDP优点:
没有握手,起步快延时小。
不需要维持双方在线,server不用维护巨量并发连接,节省了系统资源。
没有重传机制,在不影响使用的情况下,能更高效的利用网络带宽。
4.为什么不能用两次握手进行连接?
这主要是为了防止已失效的连接请求报文段突然又传到了B,因而产生错误。
现假定一种异常情况,即A发出的第一个连接请求报文段并没有丢失,而是在某些网络节点长时间滞留了,以致延误到连接释放后的某个时间才到达B。本来这是一个早已失效的报文段。但B受到此失效的连接请求报文段后,就误以为是A又发出一次新的连接请求,于是就向A发出确认报文段,同意建立连接。假定不采用第三次报文握手,那么只要B发出确认,新的连接就建立了。
由于现在A并没有发出建立连接的请求,因此不会理睬B的确认,也不会向B发送数据,但B却以为新的运输连接已经建立了,并一直等待A发来的数据。B的许多资源就这样白白浪费了。
采用三次握手连接,可以防止上述现象的发生。例如在刚才的异常情况下,A不会向B的确认发出确认,B由于收不到确认,就知道A并没有要求建立连接,于是B就不会再建立连接。
5.如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75分钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
TCP通信相关API
1.socket函数
2.bind函数
3.connect函数
4.listen函数
5.accept函数
6.shutdown函数
7.inet_pton函数
8.htons函数
9.inet_addr函数
10.send函数
11.recv函数
详细案例
本文仅用户个人整理复习使用,博客内容来自课堂及网络。 ↩︎
(1)序号:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对 此进行标记。
(2)确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。
(3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:URG:紧急指针(urgent pointer)有效。
ACK:确认序号有效。
PSH:接收方应该尽快将这个报文交给应用层。
RST:重置连接。
SYN:发起一个新连接。
FIN:释放一个连接。
需要注意:不要将确认序号ack与标志位中的ACK搞混了;确认方ack=发起方req+1,两端配对。 ↩︎