zoukankan      html  css  js  c++  java
  • 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不可以
  • 相关阅读:
    docker 部署aps.net MVC到windows容器
    docker 搭建私有仓库 harbor
    解决关于:Oracle数据库 插入数据中文乱码 显示问号???
    ionic cordova build android error: commamd failed with exit code eacces
    cordova build android Command failed with exit code EACCES
    Xcode 10 iOS12 "A valid provisioning profile for this executable was not found
    使用remix发布部署 发币 智能合约
    区块链: 编译发布智能合约
    mac 下常用命令备忘录
    JQuery fullCalendar 时间差 排序获取距当前最近的时间。
  • 原文地址:https://www.cnblogs.com/fanzihao/p/11280733.html
Copyright © 2011-2022 走看看