zoukankan      html  css  js  c++  java
  • HTTP 三次握手  建立连接 和  四次握手断开连接

    三次握手建立连接 
     
    第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;
    第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包
    第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。
     
     
    四次握手断开:
    由于 TCP 连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN 来终止这个方向的发送通道。收到一个 FIN 只意味着这一方向上没有数据流动,一个 TCP 连接在收到一个 FIN 后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。  
    ( 1 )客户端 A 发送一个 FIN ,用来关闭客户 A 到服务器 B 的数据传送(报文段 4 )。  
    ( 2 )服务器 B 收到这个 FIN ,它发回一个 ACK ,确认序号为收到的序号加 1 (报文段 5 )。和 SYN 一样,一个FIN 将占用一个序号。  
    ( 3 )服务器 B 关闭与客户端 A 的连接,发送一个 FIN 给客户端 A (报文段 6 )。  
    ( 4 )客户端 A 发回 ACK 报文确认,并将确认序号设置为收到序号加 1 (报文段 7 )。
     
    问题1: 为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?  
    这是因为服务端的 LISTEN 状态下的 SOCKET 当收 到 SYN 报文的建立连接请求后,它可以把 ACK 和 SYN ( ACK 起应答作用,而 SYN 起同步作用)放在一个报文里来发送。但关闭连接时, 当收到对方的 FIN 报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭 SOCKET, 也即你可能还需要发送一些数据给对方之后,再发送 FIN 报文给对方来表示你同意现在可以关闭连接了,所以它这里的 ACK 报文 和 FIN报文多数情况下都是分开发送的。
     
     
    HTTP 请求响应常见状态码
     100~199:表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程。
     200~299:表示成功接收请求并已完成整个处理过程。常用200
     300~399:为完成请求,客户需进一步细化请求。例如:请求的资源已经移动一个新地址、常用302(意味着你请求我,我让你去找别人),307和304(我不给你这个资源,自己拿缓存)
     400~499:客户端的请求有错误,常用404(意味着你请求的资源在web服务器中没有)403(服务器拒绝访问,权限不够)
     500~599:服务器端出现错误,常用500
  • 相关阅读:
    Redis来啦~~
    高性能mysql——高性能索引策略
    LeetCode 刷题笔记 (树)
    Java 多线程高并发编程 笔记(二)
    Java 多线程高并发编程 笔记(一)
    SVM支持向量机
    决策树
    梯度下降&随机梯度下降&批梯度下降
    统计学习方法读书笔记(1)
    HiBench学习笔记
  • 原文地址:https://www.cnblogs.com/ljlkfx/p/4825499.html
Copyright © 2011-2022 走看看