参考:https://www.cnblogs.com/lexus/archive/2012/02/21/2360944.html
https://www.jianshu.com/p/c793a279f698
https://www.cnblogs.com/Jessy/p/3535612.html
TCP/IP协议族是参考OSI模型设计的物联网协议族,其中http、ftp、ssh等协议包含会话层、表示层、应用层的协议,所以在TCP/IP协议族这三层看做是一层,即应用层。
http协议中用于OSI会话层的部分:在http1.1中默认是长连接,即http server在处理完http请求,返回response后不会立即断开连接。client可设置connection为false,server返回response后会主动断开连接。request header与body之间有一个空行,header中会通过content-len 指明body的大小,这样server就可以通过空行获得header,再从header中获得body的大小,再读取到body。
http协议中用于OSI表示层的部分:request header中content-encoding指明了数据的编码方式, content-type指明了传输数据的格式, accept 指明了client可接收的内容,accept-encoding指明了client可接收的编码方式。
http协议中用于OSI应用层的部分:request header 中url指明了操作的资源,请求方法指明了要做的操作。client(浏览器),server根据这些内容作出相应的操作,应用可以根据需求在header中添加字段,如cookei,token等。response中状态码表示操作结果。
1、用户在浏览器输入url
2、浏览器向DNS服务器请求主机名对应的IP地址
3、浏览器与server建立TCP连接
4、浏览器向server发送http request消息
5、反向代理收到http 请求消息后根据host找到匹配的upstream,根据负载均衡算法从server中选择则一个,将http请求消息发送给对应的web server。
6、websever收到http消息后解析http消息,并按照wsgi协议调用wsgi应用
7、中间件处理,如session中间、crsf中间件等
8、进入试图函数,返回response
9、中间件处理response
10、websever将response返回给反向代理
11、反向代理将response返回给浏览器
12、浏览器解析response,渲染显示html内容。
保证连接的可靠性的三次握手:1、client首先向server发送一个请求连接的请求,client变为SYN_SENT状态 。2、server收到后向client返回一个确认消息,告诉client自己接受连接,server变为SYN_RECV状态。3、client向server返回一个确认消息,告诉server自己收到了确认消息,client变为ESTABILSHED状态。4、server收到该确认消息后变为ESTABILSHED状态,连接建立成功。
异常情况:1、client进入SYN_SENT状态后,收不到ack消息,timeout后client会重发消息,重试n次后连接失败。2、server进入SYN_RECV状态后,收不到ack消息,timeout后server会重发消息,重试n次后放弃该连接。
三次握手的原因:TCP报文内是没有时间戳的,server端收到client的syn消息后,并不能确定这是一个有效的syn还是很久之前的一个syn,所以server段确认了这个syn后需要client对其再发一个确认消息,以保证请求连接的syn是有效的。
四次挥手:1、A首先向B发送一个FIN消息,进入FIN_WAIT1状态,A不再向socket中写数据。2、B收到该FIN消息后,向A发送确认消息,A在收到该确认消息后进入FIN_WAIT2状态,即等待B读完数据后关闭,B根据FIN的Sequence number可以知道自己是否已经读完了A的所有数据,B在读完A的所有数据前处于CLOSE_WAIT状态。3、B在读完A的所有数据后,向A发送FIN消息,进入LAST_ACK状态,即B不再写也不再读,只是等待最后一个确认关闭的ack。4、A在收到B的FIN后,发送ack消息,之后进入TIME_WAIT状态,timeout后释放socket。5、B收到A发送的lask ack后同样进入后释放socket。
四次挥手的原因:TCP是全双工的协议,两端都可读写,为保证可靠性,自己只能主动关闭本端的写,所以需要两端各自发送一次关闭消息后连接才可以可靠的关闭。
为什么要有TIME_WAIT状态?
<1>可靠终止TCP连接。如果最后一个ACK报文因为网络原因被丢弃,此时server因为没有收到ACK而超时重传FIN报文,处于TIME_WAIT状态的client可以继续对FIN报文做回复,向server发送ACK报文。
<2>保证让迟来的TCP报文段有足够的时间被识别和丢弃。连接结束了,网络中的延迟报文也应该被丢弃掉,以免影响立刻建立的新连接。
为什么TCP的挥手需要四次?
TCP是全双工的连接,两端都可以在连接上进行读写,两端都需要对连接进行关闭,才可以保证连接被可靠的关闭。
DOS攻击 :
DOS攻击利用合理的服务请求占用过多的服务资源,使正常用户的请求无法得到相应。
常见的DOS攻击有计算机网络带宽攻击和连通性攻击。
带宽攻击指以极大的通信量冲击网络,使得所有可用网络资源都被消耗殆尽,最后导致合法的用户请求无法通过。
连通性攻击指用大量的连接请求冲击计算机,使得所有可用的操作系统资源都被消耗殆尽,最终计算机无法再处理合法用户的请求。
SYN洪水攻击
SYN洪水攻击属于DOS攻击的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源。
客户端在短时间内伪造大量不存在的IP地址,向服务器不断地发送SYN报文,服务器回复ACK确认报文,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN报文被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。
死亡值ping
许多操作系统的TCP/IP协议栈规定ICMP包大小为64KB,且在对包的标题头进行读取之后,要根据该标题头里包含的信息来为有效载荷生成缓冲区。”死亡值ping”就是故意产生畸形的测试ping包,声称自己的尺寸超过ICMP上限,也就是加载的尺寸超过64KB上限,使未采取保护措施的网络系统出现内存分配错误,导致TCP/IP协议栈崩溃,最终接收方宕机。
TCP粘包:
TCP是可靠的传输协议,对每次发送的数据,对端都应该返回一个确认消息,这样如果把数据分为多份来发,对端就需要返回多个ack,这样就增加了网络的负担。为了减轻网络负担,TCP会在尝试先将要发送的数据放在缓冲区,当数据足够多时再一起发送。这样就会使的多条独立的数据一次性发送给对端,对端收到数据后需要将数据进行拆分,也就是拆包。如果对端读的比较慢,也会造成数据在缓冲区堆积,同样会造成粘包。
要解决粘包的问题,就需要对双方对传输数据的格式有一个共同的约定,如http协议规定请求header与body之间有两个回车换行符,header包含了body的大小的信息,这样webserver就可以对http消息进行拆包了。
UDP不存在粘包的问题,因为UDP不会将数据合并发送,接收端接收到数据后,也会在缓冲区独立存放。