传输层是端口到端口的传输
TCP(传输控制协议)
TCP报文
Source port(源端口)
destination port(目标端口)
sequence number(序号):随机,将数据包标上序号
acknowledgment number(确认号):确认号=序号+1
header length(首部长度)
reserved(保留)
control bits(控制位):
SYN:等于1时有效,请求建立新连接
ACK:确认序号标志,为1时有效,告诉客户端,我收到了你的数据
PSH:为1时表示有数据传输
FIN :1次TCP传输是否发送完毕,为1时释放连接
RST:重新连接,为1时有效。TCP连接出现错误(主机崩溃),必须释放连接,再重新连接
URG:紧急指针标志 。为1时有效
urgent(紧急指针)
options(选项和填充)
data(数据)
三次握手
握手之前:
主动连接的客户端结束closed状态
被动连接的服务器结束closed状态,并进入listen状态
开始三次握手:
客户端向服务器发送TCP报文,随后客户端进入syn-sent状态
SYN=1,表示请求建立新连接
序号=x(一般为1)
服务器收到TCP报文后,结束listen状态,返回一个TCP报文,进入SYN-rcvd状态
SYN=1,ACK=x+1。告诉客户端,我收到了你的数据
序号=y(返回一个收到信息的数据包 并给其标序号为y)
确认号=x+1
客户端收到TCP报文后,结束SYN-sent状态,返回一个TCP报文,进入ESTABLISHED状态(成功建立了连接)
ACK=1。告诉客户端,我收到了你的数据
序号=x+1(表示收到服务器端的确认号,并将其值作为自己的序号值)
确认号=y+1(表示收到服务器端序号,并将其值加1作为自己的确认号值)
端口连接状态
客户端连接状态
closed:关闭状态
SYN-sent:请求连接状态
ESTABLISHED:连接成功
服务端连接状态
LISTENING:监听状态
SYN-rcvd:发送一个连接请求后等待对方对连接请求的确认。
ESTABLISHED:连接成功
一次TCP传输的过程(可以传输无数个HTTP数据),下次传输再进行三次握手
SYN Foold攻击原理
在进行三次握手时,客户端使用攻击软件伪造IP地址向服务器发送SYN连接请求(握手的第一步)
服务器收到连接请求,将标志位 ACK和 SYN 置1发送给客户端(握手的第二步)
但是客户端的IP地址都是伪造的,服务器根本找不到客户机,也就是说握手的第三步不可能完成
这种情况下服务器端一般会重试(再次发送SYN+ACK给客户端)并等待一段时间后丢弃这个未完成的连接
这段时间的长度我们称为SYN Timeout
恶意的攻击者大量模拟这种情况,服务器端将为了维护一个非常大的半连接列表而消耗非常多的资源
即使是简单的保存并遍历也会消耗非常多的CPU 时间和内存,何况还要不断对这个列表中的IP进行SYN+ACK的重试
此时从正常客户的角度看来:服务器失去响应
这种情况我们称做: 服务器端受到了SYN Flood攻击(SYN洪水攻击 )
TCP和UDP区别
TCP
面向连接。三次握手建立连接,四次挥手解除连接
可靠传输。接收确认和重传机制
面向字节流。无保护消息边界,所以TCP存在粘包
保护消息边界:传输协议把数据当做一条独立的消息在网上传输,接收端一次只能接受一条独立的消息
举个例子:有三个数据包,大小分别为2k、4k、6k
如果采用UDP协议发送,不管接受方的接收缓存区有多大,必须要进行至少三次以上的发送才能把数据包发送完
如果采用TCP协议发送,只需要接受方的接收缓存区有12k的大小,就可以一次把这3个数据包全部发送完毕
-->造成接收方一次会接收不止一条消息,这就是粘包。
TCP只能一对一传输。因为TCP通信前要跟一台主机进行三次握手连接,因此TCP不能对多
应用
web浏览器
电子邮件
文件传输程序等
UDP
无连接。只知道对端的IP和端口号就可以发送,不需要建立连接-->高效的传输
不可靠传输。没有接收确认和重传机制。如果因为网络故障无法发到对方,UDP协议层也不会给应用层返回任何错误信息
面向数据报文。有保护消息边界,所以UDP不存在粘包
UDP不仅可以一对一,还可以一对多,多对多传输。也就是说 UDP 提供了单播,多播,广播的功能
应用
域名系统(DNS),视频流,IP语音(VoIP)等
TCP/UDP端口号
源端口随机分配,目标端口使用知名端口
源端口号:客户端访问浏览器80端口,客户端的端口号大于1023且小于65535,而且这个源端口号没被占用
目标端口号:服务端的服务进程。如telnet为23