TCP协议 UDP协议
传输控制协议(Transmission Control Protocol,TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能。用户数据报协议(UDP)是同一层内另一个重要的传输协议。
UDP是一个简单的传输层协议。和TCP相比,UDP有下面几个显著特性:
- UDP缺乏可靠性。UDP本身不提供确认,序列号,超时重传机制。UDP数据报可能在网络中被复制,被重新排序。即UDP不保证数据报会达到其最终目的地,也不保证各个数据报的先后顺讯,也不保证每个数据报只到达一次
- UDP数据报是有长度的。每个UDP数据报都有长度,如果一个数据报正确地到达目的地,那么该数据报的长度将随数据一起传递给接收方。而TCP是一个字节流协议,没有任何(协议上的)记录边界。
- UDP是无连接的。UDP客户和服务器之间不必存在长期的关系。UDP发送数据报之前也不需要经过握手创建连接的过程。
- UDP支持多播和广播。
TCP的特性
- TCP提供一种面向连接的、可靠的字节流服务
- 在一个TCP连接中,仅有两方进行彼此通信。广播和多播不能用于TCP
- TCP使用校验和,确认和重传机制来保证可靠传输
- TCP给数据分节进行排序,并使用累计确认保证数据的顺序不变和非重复
- TCP使用滑动窗口机制来实现流量控制,通过动态改变窗口的大小记你选哪个拥塞控制
注意:TCP并不能保证数据一定会被对方接收到,因为这是不可能的。TCP能够坐到的是,如果有可能,就把数据递送到接收方,否则就(通过放弃重传并且中断连接这一手段)通知用户。因此准确说TCP也不是100%可靠的协议,它所能提供的是数据的可靠递送或故障的可靠通知。
三次握手建立连接
四次挥手断开连接
应用
TCP并不是对所有的应用都适合,一些新的带有一些内在的脆弱性的运输层协议也被设计出来。比如,实时应用并不需要甚至无法忍受TCP的可靠传输机制。在这种类型的应用中,通常允许一些丢包、出错或拥塞,而不是去校正它们。例如通常不实用TCP的应用有:流媒体、网络游戏、IP电话等等。任何不是很需要可靠性或者是想将功能减到最少的应用可以避免使用TCP。在很多情况下,当只需要多路复用应用服务时,用户数据报协议(UDP)可以代替TCP为应用提供服务。
SYN攻击
- 什么是SYN攻击(SYN Flood)?
SYN攻击指的是,攻击客户端在短时间内伪造大量不存在的IP地址,想服务器不断地发送SYN包,服务器回复确认包,并等待客户的确认。由于原地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正查给你的SYN请求被丢弃,导致目标系统运行缓慢,严重者会引起网络堵塞甚至系统瘫痪。
SYN攻击是一种典型的DoS/DDoS 攻击。 - 如何检测SYN攻击?
检测SYN攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本可以判定这事一次SYN攻击。在Linux/Unix上可以使用系统自带的netstats命令来检测SYN攻击。 - 如何防御SYN攻击?
SYN攻击不能完全被阻止,除非将TCP协议重新设计。我们所做的是尽可能的减轻SYN攻击的危害,查给你剪的防御SYN攻击的方法有如下几种:
- 缩短超时(SYN Timeout)时间
- 增加最大半连接数
- 过滤网关防护
- SYN cookies技术
TCP KeepAlive
基本原理是,隔一段时间给连接对端发送一个探测包,如果收到对方回应的ACK,则认为连接还是存活的,在超过一定重试次数之后还是没有收到对方的回应,则丢弃该TCP连接。
存在的局限,监测的方式会给网络带来额外的流量,监测连接的存活与否,连接的存活不一定代表服务可用。对于应用层程序的价值是相对较小的,连接包活的应用层程序,心跳功能。
- 为什么建立连接是三次握手,而关闭连接确实四次挥手呢?
这是因为服务端在LISTEN状态下,收到建立请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方ACK和FIN一般都会分开发送。
- TCP协议和UDP协议的区别是什么?
TCP协议是有链接的,有链接的意思是开始传输实际数据之前TCP的客户端和服务器端必须通过三次握手建立连接,会话结束之后也要结束连接。而UDP是无连接的。
TCP协议保证数据按序发送,按序到达,提供超时重传来保证可靠性,但是UDP不保证按序到达,甚至不保证到达,只是努力交付,即便是按序发送的序列,也不保证按序送到。
TCP协议所需资源多,TCP首部需20个字节(不算可选项),UDP首部字段只需8个字节。
TCP是一对一的连接,而UDP则可以支持一对一,多对多,一对多的通信。
TCP面向的是字节流的服务,UDP面向的是报文的服务。
- 三次握手建立连接时,发送方再次发送确认的必要性?
主要是为了防止已失效的连接请求报文突然又传到了,而产生错误。
- 四次挥手释放连接时,等待2MSL的意义?
第一,为了保证发送端发送的最后一个ACK报文能够到达接收端。这个ACK报文段有可能丢失,因而使处在LAST-ACK状态的接收端收不到对已发送的FIN和ACK报文段的确认。接收端会超时重传这个FIN和ACK报文段,而发送端就能在2MSL时间内收到这个重传的ACK+FIN报文段。接着发送端重传一次确认。
第二,就是防止上面提到的已失效的连接请求报文段出现在本连接中,发送端在发送完最后一个ACK报文段后,再经过2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。