分类 计算机网络 下的文章

ctx.SetCookie("ZJXUSS", res.ZJXUSS, 0, "/", ctx.Request.Host, false, true)

获取cookie

cookie, err := ctx.Cookie("ZJXUSS")

结合源码了解一下http协议里的cookie:

// SetCookie adds a Set-Cookie header to the ResponseWriter's headers.
// The provided cookie must have a valid Name. Invalid cookies may be
// silently dropped.
func (c *Context) SetCookie(name, value string, maxAge int, path, domain string, secure, httpOnly bool) {
    if path == "" {
        path = "/"
    }
    http.SetCookie(c.Writer, &http.Cookie{
        Name:     name,
        Value:    url.QueryEscape(value),
        MaxAge:   maxAge,
        Path:     path,
        Domain:   domain,
        SameSite: c.sameSite,
        Secure:   secure,
        HttpOnly: httpOnly,
    })
}

gin的实际是封装了go的cookie操作http.SetCookie,第二个参数传的cookie的结构:
// A Cookie represents an HTTP cookie as sent in the Set-Cookie header of an
// HTTP response or the Cookie header of an HTTP request.
//
// See https://tools.ietf.org/html/rfc6265 for details.
type Cookie struct {
    Name  string
    Value string

    Path       string    // optional
    Domain     string    // optional
    Expires    time.Time // optional
    RawExpires string    // for reading cookies only

    // MaxAge=0 means no 'Max-Age' attribute specified.
    // MaxAge<0 means delete cookie now, equivalently 'Max-Age: 0'
    // MaxAge>0 means Max-Age attribute present and given in seconds
    MaxAge   int
    Secure   bool
    HttpOnly bool
    SameSite SameSite
    Raw      string
    Unparsed []string // Raw text of unparsed attribute-value pairs
}
name、value: 要在cookie保存的键值对
maxAge: max-age,cookie保存时间
 0: 不过期
-1: 不保存
>0: 保存多少秒
domain: 域名
secure: 防止信息传输泄漏
true: 只在https中传输,http不能传输 
false: 可以在https、http中传输
httpOnly: 禁止js读取,防止xss攻击

不带参数时,发出get请求

-A

-A参数指定客户端的用户代理标头,即User-Agent。curl 的默认用户代理字符串是curl/[version]。

$ curl -A 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36' https://google.com

上面命令将User-Agent改成 Chrome 浏览器。

$ curl -A '' https://google.com

上面命令会移除User-Agent标头。

也可以通过-H参数直接指定标头,更改User-Agent。

$ curl -H 'User-Agent: php/1.0' https://google.com

- 阅读剩余部分 -

流量控制

一般来说,我们希望数据传输的更快一些。但是如果发送方传的过快,接收方来不及接收,这就会造成数据的丢失。所谓流量控制(flow control)就是让发送方的发送速率不要太快,要让接收方来的及接收。

滑动窗口

流量控制利用滑动窗口机制来实现。
tcp报文结构中有4字节表示接收方窗口大小。发送方的发送窗口不能超过接收方的接收窗口大小。

拥塞控制

网络资源、带宽、交换机,传输需求超过了资源所能提供的可用部分,网络性能就会变坏。这就叫拥塞。

拥塞控制和流量控制的一丝差别:
拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不至过载。
拥塞控制是一个全局性的过程,涉及所有主机、路由器,所以即使tcp端点迟迟不能接收对方的消息,也无法知道拥塞到底发生在网络的何处以及发生的原因。
而流量控制往往指点对点通信量的控制。是端到端的问题。

从控制理论的角度看拥塞控制,可以分为开环控制和闭环控制。

开环控制

开环控制是在设计网络时事先将有关发生拥塞的因素考虑周到,力求网络工作时不拥塞。运行过程中不再改正。

闭环控制

闭环控制是基于反馈链路的概念。

  1. 监测网络系统一遍检测拥塞在哪里发生。
  2. 把拥塞发生的信息传送到可采取行动的地方。
  3. 调整网络系统的运行来解决出现的问题。

检测网络拥塞的主要指标:由于缺少缓存空间而被丢弃的分组的百分数、平均队列长度、超时重传的分组数、平均分租延时、分组时延的标准差等。

RFC2581定义了拥塞控制的四中算法:慢开始、拥塞避免、快重传、快恢复。

密码学

对称加密: 私钥加密,双方使用1个密钥加密解密。对称加密的特点是算法公开、加密和解密速度快,适合于对大数据量进行加密,常见的对称加密算法有AES、DES、3DES、TDEA、Blowfish、RC5和IDEA。

- 阅读剩余部分 -

一 tcp关键结构信息

  • 源端口号和目的端口:各占2字节,与ip首部ip地址组成一个唯一的tcp连接。
  • 序号和确认序号:4字节,无符号,是本报文段的第一个字节的序号,例如,一报文段的序号为300,而且数据共100字节,则下一个报文段的序号就是400;序号是32bit的无符号数,序号到达2^32-1后从0开始。确认序号是期望收到对方下次发送数据的第一个字节的序号,确认序号应该是上次已成功收到数据字节序号+1。只有ACK标志为1时,确认序号才有效。
  • 标志位:6个,各占1位。

    • SYN:请求建立连接;
    • ACK:当ACK=1,确认序号有效;
    • FIN:发送端发送完成,请求断开连接;
    • URG:注解此报文应尽快传送,而不要按本来的列队次序来传送。与“紧急指针”字段共同应用,紧急指针指出在本报文段中的紧急数据的最后一个字节的序号,使接管方可以知道紧急数据共有多长;
    • PSH:接收方应该尽快将本报文段立即传送给其应用层。
    • RST:重置连接。
  • 窗口:16位,65535,tcp通过滑动窗口进行流量控制,设想发送方发送速度很快,而接收方接受速度很慢,为了保证数据不丢,而进行流量控制。所谓滑动窗口,可理解为接收方所需要缓冲区的大小。

- 阅读剩余部分 -