在HTTP通讯过程中,是客户端还是服务端主动断开连接?

比如说:IE访问IIS,获取文件,肯定是要建立一个连接,这个连接在完成通讯后,是客户端Close了连接,还是服务端Close了连接。我用程序测模拟IE和IIS,都没有收到断开连接的消息,也就是都没有触发OnClose事件。我是用Socket建立的连接。如果两方面都没有主动断开连接,那么我猜测可能是传输的数据中有结束的标志,请问这个标志是怎样的?谢谢各位。

解决方案 ?

  1. 不知道iis是怎么弄得http的回应包中有个字段通常是close
    收到指定长度之后就应该断开的。
  2. HTTP 你的意思是B/S模式的系统设计吧。
    根本不存在保持连接这种说法。一个页面在刷新完闭之后,页面和服务器端即断开连接,两者不保持连接。
    总感觉你是在说TCP、编程。如果是的话,双方都可以主动断开连接。
  3. TO: akirya
    其中传输的数据都是HTTP包,应该不会包含Close字段的。TO:minger909
    我在做C/S的程序,用TCP的方式实现HTTP。您说的不保持连接,是对的,我就是想知道,不保持连接,是哪一方断开的?是IIS发送完数据进行Close的呢,还是IE接收完数据进行Close的呢。不解,也没有测试出来,就是没有收到OnClose的事件。To:在什么地方,什么时候来处理CExpcetion呢?
  4. HTTP/1.1都把TCP作为底层的传输协议。HTTP客户首先发起建立与服务器TCP连接。一旦建立连接,浏览器进程和服务器进程就可以通过各自的套接字来访问TCP。如前所述,客户端套接字是客户进程和TCP连接之间的“门”,服务器端套接字是服务器进程和同一TCP连接之间的“门”。客户往自己的套接字发送HTTP请求消息,也从自己的套接字接收HTTP响应消息。类似地,服务器从自己的套接字接收HTTP请求消息,也往自己的套接字发送HTTP响应消息。客户或服务器一旦把某个消息送入各自的套接字,这个消息就完全落入TCP的控制之中。TCP给HTTP提供一个可靠的数据传输服务;这意味着由客户发出的每个HTTP请求消息最终将无损地到达服务器,由服务器发出的每个HTTP响应消息最终也将无损地到达客户。我们可从中看到分层网络体系结构的一个明显优势——HTTP不必担心数据会丢失,也无需关心TCP如何从数据的丢失和错序中恢复出来的细节。这些是TCP和协议栈中更低协议层的任务。  TCP还使用一个拥塞控制机制。该机制迫使每个新的TCP连接一开始以相对缓慢的速率传输数据,然而只要网络不拥塞,每个连接可以迅速上升到相对较高的速率。这个慢速传输的初始阶段称为缓启动(slow start)。  需要注意的是,在向客户发送所请求文件的同时,服务器并没有存储关于该客户的任何状态信息。即便某个客户在几秒钟内再次请求同一个对象,服务器也不会响应说:自己刚刚给它发送了这个对象。相反,服务器重新发送这个对象,因为它已经彻底忘记早先做过什么。既然HTTP服务器不维护客户的状态信息,我们于是说HTTP是一个无状态的协议(stateless protocol)。HTTP协议状态码的含义   号码 含义 
    ----------------------------------------- 
    "100" : Continue 
    "101" : witching Protocols 
    "200" : OK 
    "201" : Created 
    "202" : Accepted 
    "203" : Non-Authoritative Information 
    "204" : No Content 
    "205" : Reset Content 
    "206" : Partial Content 
    "300" : Multiple Choices 
    "301" : Moved Permanently 
    "302" : Found 
    "303" : See Other 
    "304" : Not Modified 
    "305" : Use Proxy 
    "307" : Temporary Redirect 
    "400" : Bad Request 
    "401" : Unauthorized 
    "402" : Payment Required 
    "403" : Forbidden 
    "404" : Not Found 
    "405" : Method Not Allowed 
    "406" : Not Acceptable 
    "407" : Proxy Authentication Required 
    "408" : Request Time-out 
    "409" : Conflict 
    "410" : Gone 
    "411" : Length Required 
    "412" : Precondition Failed 
    "413" : Request Entity Too Large 
    "414" : Request-URI Too Large 
    "415" : Unsupported Media Type 
    "416" : Requested range not satisfiable 
    "417" : Expectation Failed 
    "500" : Internal Server Error 
    "501" : Not Implemented 
    "502" : Bad Gateway 
    "503" : Service Unavailable 
    "504" : Gateway Time-out 
    "505" : HTTP Version not supported  
  5. 非持久连接和持久连接  HTTP既可以使用非持久连接(nonpersistent connection),也可以使用持久连接(persistent connection)。HTTP/1.0使用非持久连接,HTTP/1.1默认使用持久连接。  非持久连接  让我们查看一下非持久连接情况下从服务器到客户传送一个Web页面的步骤。假设该贝面由1个基本HTML文件和10个JPEG图像构成,而且所有这些对象都存放在同一台服务器主机中。 再假设该基本HTML文件的URL为:www.yesky.com/somepath/index.html。  下面是具体步骡:  1.HTTP客户初始化一个与服务器主机www.yesky.com中的HTTP服务器的TCP连接。HTTP服务器使用默认端口号80监听来自HTTP客户的连接建立请求。  2.HTTP客户经由与TCP连接相关联的本地套接字发出—个HTTP请求消息。这个消息中包含路径名/somepath/index.html。  3.HTTP服务器经由与TCP连接相关联的本地套接字接收这个请求消息,再从服务器主机的内存或硬盘中取出对象/somepath/index.html,经由同一个套接字发出包含该对象的响应消息。  4.HTTP服务器告知TCP关闭这个TCP连接(不过TCP要到客户收到刚才这个响应消息之后才会真正终止这个连接)。  5.HTTP客户经由同一个套接字接收这个响应消息。TCP连接随后终止。该消息标明所封装的对象是一个HTML文件。客户从中取出这个文件,加以分析后发现其中有10个JPEG对象的引用。  6.给每一个引用到的JPEG对象重复步骡1-4。  浏览器在接收web页面的同时把它显示给用户。不同的浏览器可能会以略有不同的方式解释(也就是向用户显示)同一个web页面。HTTP与客户如何解释Web页面没有任何关系,其规范([RFC 1945]和[RFC 2616I)仅仅定义HTTP客户程序和服务器程序之间的通信协议。  上述步骤之所以称为使用非持久连接,原因是每次服务器发出一个对象后,相应的TCP连接就被关闭,也就是说每个连接都没有持续到可用于传送其他对象。每个TCP连接只用于传输一个请求消息和一个响应消息。就上述例子而言,用户每请求一次那个web页面,就产生11个TCP连接。  在上述步骡中,我们有意不说清客户是通过10个串行的TCP连接先后取得所有JPEG对象,还是通过并行的TCP连接同时取得其中某些JPEG对象。实际上,现今的浏览器允许用户通过配置来控制并行连接的程度。大多数浏览器默认可以打开5到10个并行的TCP连接,每个连接处理一个请求—响应事务。用户要是喜欢,可以把最大并行连接数设为l,那样的话这10个连接是串行地建立的。我们使用并行连接可以缩短响应时间。
  6. HTTP消息格式  HTTP规范1.0[RPcl945]和1.1[RFC 2616]定义了HTTP消息的格式。HTTP消息分为请求消息和响应稍息两类。下面我们分别进行介绍。  HTTP请求消息  下面是一个典型的HTTP请求消息:  GET /somedir/page.html H7TP/1.1 
      Host:www.yesky.com 
      Connection:close 
      User-agent:Mozilla/4.0 
      Accept-language:zh-cn 
      (额外的回车符和换行符)
     
      仔细检查这个简单的请求消息,我们可从中学到不少东西。首先,这个消息是用普通的ASCII文本书写的。其次,这个消息共有5行(每行以一个回车符和一个换行符结束),最后一行后面还有额外的一个回车特和换行符。当然,一个请求消息可以不止这么多行,也可以仅仅只有一行。该请求消息的第一行称为请求行(request line),后续各行都称为头部行(header)。请求行有3个宁段:方法字段、URL字段、HTTP版本宇段。方法字段有若干个值可供选择,包括GET、POST和HEAD。HTTP请求消息绝大多数使用GET方法,这是浏览器用来请求对象的方法,所请求的对象就在URL字段中标识。本例表明浏览器在请求对象/somedir/page.html。版本字段是不言自明的;本例中浏览器实现的是HTTP/1.1版本。  现在看一下本例中的各个头部行。头部行Host:www.yesky.com定存放所请求对象的主机。请求消息中包含头部Connection:close是在告知服务器本浏览器不想使用持久连接;服务器发出所请求的对象后应关闭连接。尽管产生这个请求消息的浏览器实现的是HTTP/1.1版本,它还是不想使用持久连接。User-agent头部行指定用户代理,也就是产生当前请求的浏览器的类型。本例的用户代理是Mozilla/4.0,它是Nelscape浏览器的一个版本。这个头部行很有用,因为服务器实际上可以给不同类型的用户代理发送同一个对象的不同版本(这些不同版本位用同一个URL寻址)。最后,Accept-languag:头部行指出要是所请求对象有简体中文版本,那么用户宁愿接收这个版本;如果没有这个语言版本,那么服务器应该发送其默认版本。Accept-languag:仅仅是HTTP的众多内容协商头部之一。-----------------------
    参考:了解WWW服务与HTTP协议
    http://biz.chinabyte.com/209/2151709_2.shtml
  7. 可以是任何一方主动断开。
    就像你编过的CS其他程序一样。
    一旦一方确认信息发送完闭,就可以Close()。另一方同样会接收到FD_CLOSE消息的。只要在Close()中处理你的释放工作就可以了。
  8. 你可以在用程序测试的时候,用netstat查看一下当前的TCP连接,如果出现close_wait状态,则说明套接字是“被动关闭的”。如果出现“time_wait"状态,说明套接字是“主动关闭的”。TCP结束的过程如下:Server                             Client-------------- FIN -------------->  server: fin_wait_1<------------- ACK --------------- client: close_wait  server:fin_wait_2<------------- FIN  --------------- client发出fin之后就关闭 -------------- ACK ------------->  server发出ack后进入time_wait状态正常情况下,应该是IIS主动关闭连接的。如果客户端(IE)主动关闭了连接,那么就会在客户端出现time_wait状态。
    Time_Wait的默认时间是2倍的MLS,就是240秒钟。MLS是TCP 片在网上的最长存活时间。
    TIME_Wait的主要作用是保证关闭的TCP端口不立即被使用。因为当网络存在延迟时,可能当某个端口被关闭后,网络中还有一些重传的TCP片在发向这个端口,如果这个端口立即建立新的TCP连接,则可能会有影响。所以使用2倍的MSL时间来限制这个端口立即被使用。
    现在的问题在于,4分钟的时间有点长。大量的Time_wait会带来一些不好的影响,首先每个TCP连接都各自有个数据结构,叫TCP Control Block.Time_wait的时候这个数据结构没有被释放。所以当有太多的TCP连接时,内存可能会被占用很多。
    你可以权衡一下,然后决定是由客户端还是服务端主动断开连接。
  9. 我记得这个close是在http的头部信息,和 200 OK是一样的.
  10. http头里有个connection的关键字的,如果是close状态,那就是服务器主动关闭了连接
  11. 汗,楼主问的问题HTTP的细节问题,怎么这么多人和TCP拉上了。HTTP是请求-响应模式的,而有时候会以关闭连接来表示数据发送完毕,所以在其协议定义中有个字段来表示谁关闭连接。HTTP1.0/1.1都支持持久连接在1.1中,如果客户端在请求中使用Connection: Close ,服务器端就会在发送完响应后从容关闭连接。但是即使客户端要求使用持久连接,但是服务器也有权在响应完请求后主动关闭连接,但是要在响应头在包含Connection: Close 。1.0和1.1一样,但是HTTP1.1默认是持久连接的,而且HTTP1.0不是。
    刚才查资源得的结果,有错请指出。
  12. :)HTTP是应用层协议,在TCP之上才能工作。真正建立连接和断开连接都是由TCP来完成的,所以说到连接问题,自然要和TCP扯上了。
  13. 感谢大家。讨论的很细,我想很多朋友可以通过该帖子了解一下HTTP。HTTP是建立在TCP上的超文本传输协议。
  14. 写过http服务器考虑两种方式:持久连接和非持久连接
    这两种连接方式首先取决于http服务器是否支持
    标准HTTP服务器支持这两种方式,特殊HTTP服务器只支持非持久连接持久连接和非持久连接都是服务器端/IE端均可控制的
    控制方式是用Connection : xxxxx字段
    Connection: Close告诉对方这次传输结束以后关闭socket
    Connection: Alive告诉对方这次传输结束以后可以再次利用这个socket以下模拟持久连接:
    IE Request 包含Connection:Alive -> HTTP服务器返回网页,HTTP头部包含 Connection: Alive -> IE在HTTP头部描述的字节数接收完毕以后提交下一个请求,其中继续包含 Connection: Alive -> HTTP服务器继续返回网页以下模拟非持久连接:
    IE Request 包含Connection:Alive -> HTTP服务器返回网页,HTTP头部包含 Connection: Close,表示自己无视IE的Alive请求 -> IE在HTTP头部描述的字节数接收完毕以后关闭socket需要说明的是,对于持久连接,Server返回的HTTP头部必须包含一个内容大小字段用来确定IE需要接收的data字节,否则持久连接就会发生问题,因为IE无法获知自己什么时候应该发送下一个请求.所以无法确定data字段大小的时候,服务器必须在适当的时候(通常是data发送结束)主动关闭socket
  15. 建议不要用mfc,好象可移植性不行.
  16. 来至  http://www.debugease.com/vc/2245132.html
时间: 2024-10-25 19:26:17

在HTTP通讯过程中,是客户端还是服务端主动断开连接?的相关文章

python3中实现客户端与服务端交互发送文件

在python3中实现客户端与服务端程序交互,从客户端发送文件到服务端 客户端代码:client.py #!/usr/bin/env python #_*_ encoding=utf-8 _*_ import socket,sys,os ip_port = ('127.0.0.1',9999) sk = socket.socket() sk.connect(ip_port) container = {'key':'','data':''} while True:     input_data =

Linux中通过ssh将客户端与服务端的远程连接

前提需要:1.在VMware中装上两台linux虚拟机,本博客使用的都是CentOS 7.2.两部虚拟机可以通过命令ping通.3.两部虚拟机中已经通过yum本地仓库安装了sshd服务. 首先  1.执行命令 :yum install sshd 安装sshd服务         2.启动sshd服务 命令:systemctl start sshd         3.查看是否有22号端口因为以后要用到  命令:netstat -an|more 再来介绍一下我使用的虚拟机以及所配置的IP1. hb

客户端与服务端建立tcp连接三次握手之前做了什么----DNS

操作系统在握手之前进行了DNS查询   DNS 迭代查询 1.操作系统会首先在本地缓存中查询IP 2.没有的话会去系统配置的DNS服务中去查询 3.如果这时候还没得话,会直接去 DNS 根服务器查询,这一步查询会找出负责 com 这个一级域名的服务器 4.然后去该服务器查询 google 这个二级域名 5.接下来三级域名的查询其实是我们配置的,你可以给 www 这个域名配置一个 IP,然后还可以给别的三级域名配置一个 IP PS:DNS 是基于 UDP 做的查询, 原文地址:https://ww

WebSocket安卓客户端实现详解(三)–服务端主动通知

WebSocket安卓客户端实现详解(三)–服务端主动通知 本篇依旧是接着上一篇继续扩展,还没看过之前博客的小伙伴,这里附上前几篇地址 WebSocket安卓客户端实现详解(一)–连接建立与重连 WebSocket安卓客户端实现详解(二)–客户端发送请求 终于是最后一篇啦,有点激动\ ( ≧▽≦ ) /啦啦啦, 服务端主动通知 热身完毕,我们先回顾下第一篇中讲到的服务端主动通知的流程 根据notify中事件类型找到对应的处理类,处理对应逻辑. 然后用eventbus通知对应的ui界面更新. 如果

项目中客户端,服务端验证,数据库联合唯一约束,事务管理。

项目中有个需求,发布一个活动,记录下参加该活动的id和参与人id,同时调用接口,往收藏夹中添加一条记录,往交易表中添加一条记录.最后根据返回的结果,给出不同的提示信息. 1.如果当前的在jsp页面上面做处理,判断是否参与过.参加过之后,参加按钮不可点.没有参加的情况,参加按钮可以点. 2.jsp客户端加上js处理,参加按钮点击完之后,按钮不可点. 3.在controller中,业务逻辑开始前,再次java判断是否参加过该活动. 4.在数据库中参与表(活动id,参与人id)加上联合唯一约束.根据异

BI实施过程中的工具与服务

成功的BI项目,不仅仅是应用了BI工具软件,还要具备完善的BI服务体系,才能称之为真正成功的商业智能bi项目. 现在的BI(商业智能)比起几年前的ERP一样,成为CIO们关注的焦点.在ERP等基础信息系统部署完之后,企业能够对其业务数据进行更为有效的管理,如何利用这些数据创造价值成为企业下一步思考的问题.在这一背景下,BI被提上日程.与操作型系统ERP不同,BI是分析型系统,利用BI分析的结果给企业带来商业价值才是BI系统实施成功的重要标志. 2008年,某著名品牌饮料公司宣布其以应用分析系统建

基于socket.io客户端与服务端的相互通讯

socket.io是对websocket的封装,用于客户端与服务端的相互通讯.官网:https://socket.io/. 下面是socket.io的用法: 1.由于使用express开的本地服务,先下载相关依赖 cnpm install express socket.io 2.服务端代码 const express = require("express"); const io = require("socket.io"); const app = express(

带线程池的socket客户端与服务端

前言 socket(套接字),Socket和ServerSocket位于java.net包中,之前虽然对socket有过一些了解,但一直都是云里雾里的,特意仔细的学习了一个socket,用socket模拟一个天气查询的功能,并且解决了几个使用socket过程中比较严重的问题. 最简单的客户端和服务端 服务端代码 1 package cn.hucc.socket.server; 2 3 import java.io.DataInputStream; 4 import java.io.DataOut

使用多线程实现多个客户端与服务端通信1

Server.java package socket; import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.InetAddress;import java.net.ServerSocket;import java.net.Socket; /** * 聊天室服务端 * @author 小