1. TCP和UDP的区别和优缺点及应用场景
https://www.cnblogs.com/GuoXinxin/p/11657676.html
①TCP协议是有连接的,有连接的意思是开始传输实际数据之前TCP的客户端和服务器端必须通过三次握手建立连接,会话结束之后通过四次挥手结束连接。而UDP是无连接的
②TCP协议保证数据按序发送,按序到达,提供超时重传来保证可靠性,但是UDP不保证按序到达,甚至不保证到达,只是努力交付,即便是按序发送的序列,也不保证按序送到。
③TCP有流量控制和拥塞控制,而UDP没有,所以UDP即使网络拥堵客户端的发送速率也不会有影响
④TCP协议所需资源多,TCP首部需20个字节(不算可选项),UDP首部字段只需8个字节。
⑤TCP只支持一对一通信,而UDP支持一对一,一对多,多对多通信
⑥TCP是面向字节流,可靠的服务,,发送的是一个流数据。UDP是面向报文,不可靠的服务,一个一个的发,一个一个的收。
⑦TCP注重数据安全性,UDP数据传输快,因为不需要连接等待,少了许多操作,但是其安全性却一般
采用TCP传输协议的MSN比采用UDP的QQ传输文件慢
但并不能说QQ的通信是不安全的,因为程序员可以手动对UDP的数据收发进行验证, 比如发送方对每个数据包进行编号然后由接收方进行验证什么的。
2. TCP三次握手及原因
3. 三次握手过程中有哪些不安全性
1)伪装的IP向服务器发送一个SYN请求建立连接,然后服务器向该IP回复SYN和ACK,但是找不到该IP对应的主机,当超时时服务器收不到ACK会重复发送。当大量的攻击者请求建立连接时,服务器就会存在大量未完成三次握手的连接,服务器主机backlog被耗尽而不能响应其它连接。即SYN泛洪攻击 ,(属于DOS的一种,发送大量的半连接请求,耗费CPU和内存资源,引起网络堵塞甚至系统瘫痪)
当你服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击。在Linux下可以如下命令检测是否被Syn攻击
netstat -n -p TCP | grep SYN_RECV
防范措施:
1、降低SYN timeout时间,使得主机尽快释放半连接的占用
2、采用SYN cookie设置,如果短时间内连续收到某个IP的重复SYN请求,则认为受到了该IP的攻击,丢弃来自该IP的后续请求报文
3、在网关处设置过滤,拒绝将一个源IP地址不属于其来源子网的包进行更远的路由
2)当一个主机向服务器发送SYN请求连接,服务器回复ACK和SYN后,攻击者截获ACK和SYN。然后伪装成原始主机继续与服务器进行通信
4. TCP四次挥手及原因
5. 为什么TCP可以可靠传输
拥塞控制,流量窗口,慢启动,快重传,快恢复。。。。
6. TIME_WAIT状态持续时间及原因
- 为了可靠的断开TCP连接,假设最后客户端回复的ACK丢失,服务器端会在超时时间到来时,重传最后一个FIN包。ACK和FIN在网络中的最长生存时间就为2MSL,这样就可以可靠的断开TCP的双向连接。
- 一个数据包在网络中的最长生存时间为MSL,持续2MSL时间,可以让上一次连接的数据包在网络中消失,以防影响下一次连接。
所谓的2MSL是两倍的MSL(Maximum Segment Lifetime最大 报文段存活时间(往返时间))。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。
7. 超时重传和快速重传
- 超时重传:当超时时间到达时,发送方还未收到对端的ACK确认,就重传该数据包
- 快速重传:当后面的序号先到达,如接收方接收到了1、 3、 4,而2没有收到,就会立即向发送方重复发送三次ACK=2的确认请求重传。如果发送方连续收到3个相同序号的ACK,就重传该数据包。而不用等待超时
8. TCP首部长度,有哪些字段(画出TCP报文)?及TCP选项有哪些?
最少20字节,因为TCP的头部中20字节的首部是固定的
TCP首部选项字段多达40B,一些常用的字段有:
1)选项结束字段(EOP,0x00),占1B,一个报文段仅用一次。放在末尾用于填充,用途是说明:首部已经没有更多的消息,应用数据在下一个32位字开始处
2)无操作字段(NOP, 0x01),占1B,也用于填充,放在选项的开头
3)MSS(最大报文段长度),格式如下:种类(1B,值为2),长度(1B,值为4),数值(2B)
用于在连接开始时确定MSS的大小,如果没有确定,就用默认的(一般实现是536B)
4)窗口扩大因子,格式如下:种类(1B,值为3),长度(1B,值为3),数值(1B)
新窗口值 = 首部窗口值 * 2的(扩大因子)次方
当通信双方认为首部的窗口值还不够大的时候,在连接开始时用这个来定义更大的窗口。仅在连接开始时有效。一经定义,通信过程中无法更改。
5)时间戳(应用测试RTT和防止序号绕回)
6)允许SACK和SACK选项
9. TCP在listen时的参数backlog的意义
linux内核中会维护两个队列:
1)未完成队列:接收到一个SYN建立连接请求,处于SYN_RCVD状态
2)已完成队列:已完成TCP三次握手过程,处于ESTABLISHED状态
当有一个SYN到来请求建立连接时,就在未完成队列中新建一项。当三次握手过程完成后,就将套接口从未完成队列移动到已完成队列。
backlog曾被定义为两个队列的总和的最大值,也曾将backlog的1.5倍作为未完成队列的最大长度,一般将backlog指定为5 。
10. accept发生在三次握手的哪一步
accept会监听已完成队列是否非空,当队列为空时,accept就会阻塞。当队列非空时,就从已完成队列中取出一项并返回。
而已完成队列中的都是三次握手过程已经完成的,因此accept发生在三次握手之后。
三次握手是发生在connect函数中,connect函数执行成功就相当于已经建立三次握手
11. 有哪些应用层协议是基于TCP的,哪些是基于UDP的
- TCP: FTP、HTTP、Telnet、SMTP、POP3、HTTPS
- UDP:DNS、SNMP、NFS
12. TCP报文长度是在TCP三次握手中哪一次确定的(第三次)
这个是关于TCP报文的最大报文段长度mss的相关问题。在TCP连接的前两次握手中(SYN报文中),通信双方都会在选项字段中告知对方自己期待收到最大报文长度(mss值),以双方两个SYN报文中最小的mss最为本次数据传输的mss值。通信双方以“协商”的方式来确定报文长度的,前两次握手是告诉对方自己的mss值,在第三次握手确定mss值。
13. TCP报文长度是由什么确定的
这个跟具体传输网络有关,以太网的MTU为1500字节,Internet的MTU为576字节。
MTU是网络层的传输单元,那么MSS = MTU - 20字节(IP首部) - 20字节(TCP首部)。所以以太网的MSS为1460字节,而Internet的MSS为536字节。
14. 如果TCP连接过程中,第三次握手失败怎么办
server端发送了SYN+ACK报文后就会启动一个定时器,等待client返回的ACK报文。如果第三次握手失败的话client给server返回了ACK报文,server并不能收到这个ACK报文。那么server端就会启动超时重传机制,超过规定时间后重新发送SYN+ACK,重传次数根据/proc/sys/net/ipv4/tcp_synack_retries来指定,默认是5次。如果重传指定次数到了后,仍然未收到ACK应答,那么一段时间后,server自动关闭这个连接。但是client认为这个连接已经建立,如果client端向server写数据,server端将以RST包响应,方能感知到server的错误。
15. DOS攻击 拒绝服务攻击
DoS(分布式拒绝服务攻击) DOS攻击利用合理的服务请求占用过多的服务资源,使正常用户的请求无法得到响应。
常见的DOS攻击有计算机网络带宽攻击和连通性攻击。
- 带宽攻击指以极大的通信量冲击网络,使得所有可用网络资源都被消耗殆尽,最后导致合法的用户请求无法通过。
- 连通性攻击指用大量的连接请求冲击计算机,使得所有可用的操作系统资源都被消耗殆尽,最终计算机无法再处理合法用户的请求。
16. 死亡值ping ???
许多操作系统的TCP/IP协议栈规定ICMP包大小为64KB(网间控制报文),且在对包的标题头进行读取之后,要根据该标题头里包含的信息来为有效载荷生成缓冲区。 ”死亡值ping”就是故意产生畸形的测试ping包,声称自己的尺寸超过ICMP上限,也就是加载的尺寸超过64KB上限,使未采取保护措施的网络系统出现内存分配错误,导致TCP/IP协议栈崩溃,最终接收方宕机。
17. 以太网与Internet的区别
18. 找UDP编程的项目