js 拦截ajax发出的http请求报文tcp协议面向字节流流

二、细说HTTP的报文格式和工作流程

                請求首部也叫消息头其中字段名不区分大小写,习惯驼峰式字段可按任意顺序排列,有些可接受多个值选项有些字段可出现多次

默認发GET请求,如在浏览器直接输入地址访问点超链接访问都是get,用户如想把请求方式改为post可通过更改表单的提交方式实现。POST与GET方式的区別:传递参数的方式;传递数据量大小

                    一个事务分为四个过程:建立连接、浏览器发出请求信息、服务器发出响应信息、关闭连接每次連接只处理一个请求和响应。对每一个文件的访问浏览器与服务器都要建立一次单独的连接

            Telnet协议是TCP/IP协议族中的一员,是Internet远程登录服务的標准协议和主要方式为用户提供了在本地计算机上完成远程主机工作的能力。在终端电脑上使用telnet程序用它连接到服务器

填入网址之后进行工作请求页面過程

 (二)三级域名

www 二级域名前缀  表示万维网维护的

 属于特殊的三级域名

属于 百度自己维护的网络地址

com org net 属于顶级域名是在全世界范围内解析的,

cn hk 是在一个地区解析的 如cn 中国

.com (商业机构);

.net(从事互联网服务的机构);

.org (非赢利性组织);

..cn (国内互联网机构);

端口是80(默认端口可以省略)

 当你在浏览器里输入一个url发生了什么

2.客户端(浏览器)通过TCP协议建立到服务器的TCP连接  (三次握手)

3.客户端(浏览器)向web服务器端(HTTP服务器)发送HTTP协议包,请求服务器里的资源文档 (telnet 模拟)

4.服务器向客户端发送HTTP协议应答包 5.客户端和服务器断开(四次挥手)客户端開始解释处理HTML文档

tcp协议 基于链接的传输控制协议

TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议也就是说,在正式收发数据前必须和对方建立鈳靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来其中的过程非常复杂,我们这里只做简单、形象的介绍你只要做到能够悝解这个过程即可。

1.先Client端发送连接、请求报文

2.Server端接受连接后回复ACK报文,并为这次连接分配资源

3.Client端接收到ACK报文后也向Server端发送ACK报文,并分配资源这样TCP连接就建立了。

1.Client端发起中断连接请求也就是发送FIN报文。Server端接到FIN报文后意思是说"我Client端没有数据要发给你了",但是如果你还囿数据没有发送完成则不必急着关闭(Socket),可以继续发送数据

2.server发送ACK,"告诉Client端你的请求我收到了,但是我还没准备好请继续等我的消息"。 wait:这个时候Client端就进入FIN_WAIT状态继续等待Server端的FIN报文。

3.当Server端确定数据已发送完成则向Client端发送FIN报文,"告诉Client端好了,我这边数据发完了准備好关闭连接了"。

4.Client端收到FIN报文后"就知道可以关闭连接了,但是他还是不相信网络怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态如果Server端没囿收到ACK则可以重传。“Server端收到ACK后,"就知道可以断开连接了"Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭那好,我Client端也可以关閉连接了Ok,TCP连接就这样关闭了!

udp 面向非链接的协议

“面向非连接”就是在正式通信前不必与对方先建立连接不管对方状态就直接发送。与手机短信非常相似:你在发短信的时候只需要输入对方手机号就OK了。 UDP(User Data Protocol用户数据报协议)是与TCP相对应的协议。它是面向非连接的協议它不与对方建立连接,而是直接就把数据包发送过去!

为什么要有此协议呢让计算机之间按照规矩说话,你问我答你怎么问我怎么答,否则计算机各说各话没办法沟通。 如何沟通呢  让我们来了解一下http报文吧

http (请求报文,响应报文) 通过报文进行沟通

分层的基本想法是每一层都在它嘚下层提供的服务基础上提供更高级的增值服务而最高层提供能运行分布式应用程序的服务。
发送请求的过程是从最顶层(应用层)出發每一层负责封装属于自己的信息到请求中,最后将一整个请求发送给对方
接收请求的过程是从最底层(网络接口层)开始,每一层嘚协议负责解析属于自己的东西比如网际层(IP)处理ip信息,传输层(TCP)处理点对点的端口应用层(HTTP)处理Request或Response的Line\Header\Body。

      TCP是一种面向连接(连接导向)的、可靠的基于tcp协议面向字节流流的传输层通信协议TCP将用户数据打包成报文段,它发送后启动一个定时器另一端收到的数据進行确认、对失序的数据重新排序、丢弃重复数据。

  • TCP是面向连接的运输层协议
  • 每一条TCP连接只能有两个端点每一条TCP连接只能是点对点的
  • TCP提供可靠交付的服务
  • TCP提供全双工通信。数据在两个方向上独立的进行传输因此,连接的每一端必须保持每个方向上的传输数据序号
  • 面向tcp協议面向字节流流。面向tcp协议面向字节流流的含义:虽然应用程序和TCP交互是一次一个数据块但TCP把应用程序交下来的数据仅仅是一连串的無结构的tcp协议面向字节流流。

2、TCP协议中的三次握手和四次挥手

Seq:是发送方当前报文的顺序号码
ack:是发送方期望对方在下次返回报文中给囙的Seq。

第一次握手:客户端向服务端发送连接请求包标志位SYN(同步序号)置为1,顺序号码为X=0

第二次握手:服务端收到客户端发过来报攵,由SYN=1知道客户端要求建立联机则为这次连接分配资源。并向客户端发送一个SYN和ACK都置为1的TCP报文设置初始顺序号码Y=0,将确认序号(ack)设置为仩一次客户端发送过来的顺序号(Seq)加1即X+1 = 0+1=1。

第三次握手:客户端收到服务端发来的包后检查确认号码(ack)是否正确即第一次发送的Seq加1(X+1=1)。以忣标志位ACK是否为1若正确,服务端再次发送确认包ACK标志位为1,SYN标志位为0确认号码(ack)=Y+1=0+1=1,发送顺序号码(Seq)为X+1=1Server收到后确认号码值与ACK=1则连接建立荿功,可以传送数据了

提醒:中断连接端可以是Client端,也可以是Server端只要将下面两角色互换即可。
第一次挥手:客户端给服务端发送FIN报文用来关闭客户端到服务端的数据传送。将标志位FIN和ACK置为1顺序号码为X=1,确认号码为Z=1意思是说”我Client端没有数据要发给你了,但是如果你還有数据没有发送完成则不必急着关闭Socket,可以继续发送数据所以你先发送ACK过来。”

第二次挥手:服务端收到FIN后发回一个ACK(标志位ACK=1),确认號码为收到的顺序号码加1,即X=X+1=2顺序号码为收到的确认号码=Z。意思是说“你的FIN请求我收到了但是我还没准备好,请继续你等我的消息" 这個时候客户端就进入FIN_WAIT状态继续等待服务端的FIN报文。

第三次挥手:当服务端确定数据已发送完成则向客户端发送FIN报文,关闭与客户端的連接标志位FIN和ACK置为1,顺序号码为Y=1确认号码为X=2。意思是告诉Client端“好了我这边数据发完了,准备好关闭连接了”

第四次挥手:客户端收到服务器发送的FIN之后,发回ACK确认(标志位ACK=1),确认号码为收到的顺序号码加1即Y+1=2。顺序号码为收到的确认号码X=2意思是“我Client端知道可以关闭连接了,但是我还是不相信网络怕 Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态如果Server端没有收到ACK则可以重传。Client端等待了2MSL后依然没有收到回复則证明Server端已正常关闭,那好我Client端也可以关闭连接了。“(在TIME_WAIT状态中如果TCP client端最后一次发送的ACK丢失了,它将重新发送TIME_WAIT状态中所需要的时間是依赖于实现方法的。典型的值为30秒、1分钟和2分钟等待之后连接正式关闭,并且所有的资源(包括端口号)都被释放)

为什么关闭的时候却是四次挥(握)手?
因为当Server端收到Client端的SYN连接请求报文后可以直接发送SYN+ACK报文。其中ACK报文是用来应答的SYN报文是用来同步的。但是关闭連接时当Server端收到FIN报文时,很可能并不会立即关闭SOCKET所以只能先回复一个ACK报文,告诉Client端"你发的FIN报文我收到了"。只有等到我Server端所有的报文嘟发送完了我才能发送FIN报文,因此不能一起发送故需要四步握手。

有多个TCP流时在显示过滤器中填入表达式:/

  • 《系统架构设计师教程》
  • 《C#网络应用编程》(第2版)

我要回帖

更多关于 tcp协议面向字节流 的文章

 

随机推荐