TCP和IP报文格式(了解)
企业微信截图_de49694a-84f6-4793-a4b0-48297176abb2.png
企业微信截图_0c38bafe-a42f-4fc0-8586-2ad969d1899d.png
TCP/IP
应用层->传输层->网络层->链路层->物理层
程序在发送消息时,应用层按既定的协议打包数据 ,随后由传输层加 上双方的端口号 ,由网络层加上双方的 IP 地址,由链路层加上双方的 MAC 地址 ,并将数据拆分成数据帧 ,经过多个路由器和网关后 ,到达目标机器。简而言之,就是按“端口→ IP 地址→ MAC 地址 ” 这样的路径进行数据的封装和发送 , 解包的时候反过来操作即可。
TTL,即数据包的生存时间,它是数据包可经过的最多路由器总数。
TCP的FLAG位由6个bit组成,分别代表ACK、 SYN、 F町、 URG、 PSH、 RST,都以置 l 表示有效。SYN ( Synchronize Sequence Numbers ) 用作建立连接时的同步信号;ACK ( Acknowledgement )用于对收到的数据进行确认,所确认的数据由确认序列号表示; FIN ( Finish )表示后面没有数据需要发送,通常意昧着所建立的连接需要关闭了。
三次握手
- A->B: SYN =1,seq=x
- B->A: SYN=1,ACK=1,ack=x+1,seq=y
- A->B: ACK=1,ack=y+1
四次挥手
- A->B: FIN=1,seq = u
- B->A: ACK=1,ack = u+1,seq=v
- B->A: FIN=1,ACK=1,ack=u+1,seq=w
- A->B: ACK=1,ack=w+1,seq =u+1
TIME_WAIT和CLOSE_WAIT
TIME_WAIT=2MSL,一般来说,MSL大于TTL衰减至0的时间,在RFC793中规定MSL为2分钟,生产环境建议修改该值。在服务器上通过变更/etc/sysctl.conf文件来修改该缺省值(秒) net.ipv4.tcp_fin_timeout = 30 (建议小于 30 秒为宜)
出现大量请求超时时,该怎么处理
- 检查请求方和服务方超时时间设置
- 检查请求方(feign/okHttp)线程数+队列设置,服务方(tomcat)线程数+队列设置,可通过stack指令查看线程情况
- 检查TIME_WAIT配置,默认4分钟,最好小于30秒。
浏览器输入地址后,发生的过程
- 查询DNS,获取IP地址
- 向服务端发送报文
- 应用层,生成报文
- 传输层,加上端口,并建立连接(三次握手)
- 网络层,加上ip
- 链路层,加上mac地址
- 物理层,发送请求报文
- 服务端反向解析报文
- 四次挥手断开链接
- 客户端解析响应报文,显示html页面
粘包、拆包
- 原因,TCP是面向流的没有边界的概念,当接收到两个包放入同一个流中时可能导致粘包现象。
- 解决方案1,固定包长度
- 解决方案2,设置边界符号
四层和七层负载均衡
** 四层负载**
- 即在OSI第4层工作,就是TCP层
- 通过报文中的目标地址和端口,决定最终选择的内部服务器
** 七层负载 ** - OSI的最高层,应用层
- 通过报文中的真正有意义的应用层内容,决定最终选择的内部服务器