http协议,TCP三次握手,四次分手

1. 参考链接

https://blog.csdn.net/qq_33616529/article/details/78288883

https://mp.weixin.qq.com/s/V3_u4uls3d7Sm6VLdjKpdQ

2. http协议是什么

http(HyperText Transfer Protocol),超文本传输协议,是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范。

3. http协议组成部分

3.1. 请求报文

客户端通过发送http请求向服务器请求对资源的访问

3.1.1. 请求行

包含:

  • 请求方法
  • url
  • 协议版本

用空格分隔:如 GET/sample.jsp HTTP/1.1

3.1.1.1. 请求方法
  1. OPTIONS
  2. GET
  3. HEAD
  4. POST
  5. PUT
  6. DELETE
  7. TRACE
  8. CONNECT

3.1.2. 请求头

包含有关客户端环境及请求正文的信息,如请求正文长度、浏览器所用编码格式等,例如:

Accept:image/gif.image/jpeg.*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible:MSIE5.01:Windows NT5.0)
Accept-Encoding:gzip,deflate

3.1.3. 请求数据

即客户端发送给服务器的内容,可为空(GET请求就没有请求数据),例如:username=jinqiao&password=1234

3.1.4. 注意

  • 请求头和请求数据之间必须有空行做区分。

3.2. 应答报文

http应答报文是指服务器回应http请求,发送给客户端的消息

3.2.1. 状态行

  • 协议版本
  • 状态码
  • 简要描述

HTTP/1.1 200 OK

3.2.2. 响应头

  • 必须指明 Content-Type ,其他可选。如:Content-Type: text/plain

3.2.3. 响应数据

服务器返回的消息体

4. http协议状态码

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

https://www.runoob.com/http/http-status-codes.html

5. 请求与响应

5.1. 建立连接

  • 通过DNS解析,将域名转换成IP地址
  • 通过IP+端口号建立socket。

通过三次握手建立TCP连接,确定通讯正常。

5.2. 发送请求命令

socket建立好后,客户端向web服务器发送请求命令(GET/POST)

5.3. 发送请求头和请求数据

客户端先发送与自身相关的信息,再发送空行表示请求头发送完毕,如果是POST则继续发送请求正文。

5.4. 回传状态行

应答第一步,发送协议版本和状态码

5.5. 回传应答头

应答第二步,先发送自身相关信息、Content-Type(必须)及被请求的文档,在发送空行表示应答头发送完毕。

5.6. 回传应答正文

应答第三步,根据应答头的Content-Type指定的格式发送应答正文。

5.7. 关闭连接

一次‘会话’完成,如果设置了Connection:keep-alive则TCP连接不关闭,否则关闭连接。

6. HTTP协议基于 TCP/IP协议

TCP/IP协议模型(Transmission Control Protocol/Internet Protocol),包含了一系列构成互联网基础的网络协议,是Internet的核心协议。

TCP/IP协议簇是一组不同层次上的多个协议的组合,通常被认为是一个四层协议系统,与OSI的七层模型相对应。

HTTP协议是基于TCP/IP协议模型来传输信息的。

参考链接:https://blog.csdn.net/u010359398/article/details/82142449

7. TCP三次握手

TCP——SYN、ACK、FIN、RST、PSH、URG详解 : https://blog.csdn.net/dyzhen/article/details/45065319

  • SYN:位数置1,表示建立TCP连接
  • ACK:表示验证字段
  • FIN:位数置1,表示断开TCP连接
  • RST
  • PSH
  • URG

7.1. 过程

客户端 服务端 请求建立链接(SYN): SYN=1,seq=x 进入等待状态 SYN_SEND 响应请求,是否建立联系(SYN+ACK): SYN=1,ack=x+1,seq=y 进入SYN_ RECV状态 确认建立链接(ACK): SYN=1,ack=y+1,seq=x+1 进入ESTAB LISHED状态 进入ESTAB LISHED状态 完成建立链接 客户端 服务端 三次握手

7.1.1. 第一次:客户端发起建立请求-syn

客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x(x为随机生成的数值);然后,客户端进入SYN_SEND状态,等待服务器的确认;

7.1.2. 第二次:服务端返回确认消息-syn+ack

服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y(y为随机生成数值);服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;

7.1.3. 第三次:客户端接收确认消息,发送-ack

客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。

7.2. 意义

为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。

具体例子:“已失效的连接请求报文段”的产生在这样一种情况下:

  • client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。
  • 本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。
  • 于是就向client发出确认报文段,同意建立连接。
  • 假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。
  • 由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。
  • 但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。
  • 采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。
  • server由于收不到确认,就知道client并没有要求建立连接。”

8. TCP四次分手

可以是客户端发起,也可以是服务端发起,下面以客户端发起为例

客户端 服务端 我要分手,FIN=1,seq=x 进入FIN_W AIT_1状态 好,我成全你,FIN=1,ack=x+1,seq=y 进入FIN_W AIT_2状态 我这边收拾好了,分手吧。FIN=1,ack=x+1,seq=z 进入 LAST_ACK 状态 好,再见。FIN=1,ack=z+1,seq=h 关闭连接 进入 TIME_WAIT 状态 2MSL后没有收到 服务端消息,连接关 链接关闭,停止传输 客户端 服务端 四次分手

8.1. 过程

8.1.1. 第一次

主机1(可以使客户端,也可以是服务器端),设置Sequence Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;

8.1.2. 第二次

主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭请求;

8.1.3. 第三次

主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态;

8.1.4. 第四次

主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。

8.2. 意义

  • TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。

  • TCP是全双工模式

  • 这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;

  • 但是,这个时候主机1还是可以接受来自主机2的数据;

  • 当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;

  • 当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。

9. 拆包粘包

https://blog.csdn.net/ailunlee/article/details/95944377

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值