• TCP,UDP,HTTP


    TCP

    • 面向连接的、可靠的、基于字节流的传输层通信协议
    • 将应用层的数据流分割成报文段并发送给目标节点的TCP层
    • 数据包都有序号,对方收到则发送ACK确认,未收到则重传
    • 使用校验和来检验数据在传输过程中是否有误

    TCPflags

    • URG:紧急指针标志
    • ACK:确认序号标志
    • PSH:push标志
    • SYN:建立连接标志
    • FIN:释放连接标志
    • RST:重置连接标志

    三次握手


    在TCP协议中,TCP协议提供可靠的服务,采用三次握手建立一个连接

    1. 第一次握手:建立连接时,客户端发送SYN包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认
    2. 第二次握手:服务器收到SYN包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
    3. 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=j+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手

    为什么三次握手才能建立连接

    • 为了要初始化Sequence Number的初始值,通信的双方要互相通知对方自己的SYN初始值,作为以后的数据通讯的序号,来保证应用层数据不会因为网络上的传输问题而乱序,即TCP会用这个数据来拼接数据

    首次握手隐患:SYN超时问题

    • 起因:

    ​ Server收到Client的SYN,在回复SYN+ACK的时候未收到ACK确认

    ​ Server不断重发直至超时,在linux系统中是63秒才断开连接

    • 针对SYN-Flood的防护措施

      ​ SYN队列满后,通过tcp_syncookies参数回发SYN Cookie

      ​ 若为正常连接则Client会回发SYN Cookie,直接建立连接

    • 建立连接后Client发生故障怎么办——保活机制:

    ​ 向对方发送保活探测报文,如果未收到响应则继续发送

    ​ 尝试次数达到保活探测数仍未收到响应,则断开连接

    四次挥手


    1. 第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态

    2. 第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到的序号加一(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态

    3. 第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态

    4. 第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到的序号加一,Server进入CLOSED状态,完成四次挥手

    为什么会有TIME_WAIT状态

    • ​ 确保有足够的时间让被动关闭的一方收到ACK
    • ​ 避免新旧连接混淆

    为什么需要四次挥手才能断开

    • 因为全双工,发送方和接收方都需要ACK报文和FIN报文

    服务器出现大量CLOSE_WAIT状态的原因

    • 对方关闭socket连接,但接收方忙于读或写,没有及时关闭连接,通常是因为程序中有BUG

    解决方式

    • 检查代码,特别是释放资源的代码
    • 检查配置,特别是处理请求的线程配置  (线程池的配置)

    ​ 检查配置,特别是处理请求的线程配置  线程池的配置

    UDP

    UDP特点

    1. 面向非连接
    2. 不维护连接状态,支持同时向多个客户端传输相同的消息
    3. 数据包报头只有八个字节,额外数据开销较小
    4. 吞吐量只限制于数据生成速率、传输速率以及机器性能
    5. 尽最大努力交付,不保证可靠交付,不需要维持复杂的连接状态
    6. 面向报文,不对应用程序提交的报文信息进行拆分或者合并

    TCP和UDP的区别

    • 面向连接和无连接
    • 可靠性
    • 有序性
    • 速度
    • 量级  体现在头大小(20,8)

    TCP的滑动窗口:

    • ​ 用滑动窗口做流量控制和乱序重排

    RTT 和 RTO

    • RTT:发送一个数据包,到收到相对应的ACK所需要的时间
    • RTO:重传时间间隔

    保证TCP的可靠性

    保证TCP的流控特性

    HTTP

    HTTP协议的特点

    • 支持客户/服务器模式

    • 简单快速

    • 灵活 类型灵活 Content Type标记

    • 无连接 下层实现对上层透明

    • 无状态 协议对事物处理没有记忆能力,若需要之前的数据,则需要进行重传

    键入URL按下回车后经历的流程

    1. DNS解析
    2. TCP连接
    3. 发送HTTP请求
    4. 处理请求并返回HTTP响应
    5. 浏览器渲染页面
    6. 连接结束

    HTTP状态码

    • 1**:指示信息—表示请求已接受,继续处理
    • 2**:成功—表示请求已被成功接收、理解、接受
    • 3**: 重定向—要完成请求需要进行更进一步的操作
    • 4**:客户端错误—请求有语法错误或请求无法实现
    • 5**:服务器端错误—服务器未能实现合法的请求

    GET和POST的区别

    • HTTP层面:get将请求信息放在URL中,post放在报文体中
    • 数据库层面:get符合幂等性(对数据库的一次和多次操作的结果一致)和安全性,post不符合
    • 其他层面:get请求能够被缓存、被储存,post不可以
  • 相关阅读:
    如何分秒必争--浅淡时间切片器
    2019微软Power BI 每月功能更新系列——Power BI 6月版本功能完整解读
    2019微软Power BI 每月功能更新系列——Power BI 5月版本功能完整解读
    自制操作系统 ---- 资料
    [书籍推荐] 编程入门学习必备
    《30天自制操作系统》笔记5 --- (Day3)进入32位模式并导入C语言
    精彩知识视频分享
    《30天自制操作系统》笔记4 --- (Day2 下节)了解如何用汇编写操作系统中的HelloWorld
    《30天自制操作系统》笔记3 --- (Day2 上节)完全解析文件系统
    新版Notepad++加十六进制查看的插件HexEditor
  • 原文地址:https://www.cnblogs.com/fanzihao/p/11280733.html
Copyright © 2020-2023  润新知