社区
网络编程
帖子详情
在HTTP通讯过程中,是客户端还是服务端主动断开连接?
jemmylau
2007-04-05 03:36:54
比如说:IE访问IIS,获取文件,肯定是要建立一个连接,这个连接在完成通讯后,是客户端Close了连接,还是服务端Close了连接。
我用程序测模拟IE和IIS,都没有收到断开连接的消息,也就是都没有触发OnClose事件。我是用Socket建立的连接。
如果两方面都没有主动断开连接,那么我猜测可能是传输的数据中有结束的标志,请问这个标志是怎样的?
谢谢各位。
...全文
3636
22
打赏
收藏
在HTTP通讯过程中,是客户端还是服务端主动断开连接?
比如说:IE访问IIS,获取文件,肯定是要建立一个连接,这个连接在完成通讯后,是客户端Close了连接,还是服务端Close了连接。 我用程序测模拟IE和IIS,都没有收到断开连接的消息,也就是都没有触发OnClose事件。我是用Socket建立的连接。 如果两方面都没有主动断开连接,那么我猜测可能是传输的数据中有结束的标志,请问这个标志是怎样的? 谢谢各位。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
22 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
cust_hf
2007-11-03
打赏
举报
回复
楼上的已经说得够明白啦。
常见的情况是客户端和服务器都根据情况(数据是不是传输完毕,通信的模式,应用程序是不是要关闭了)等主动关闭连接。
aobai219
2007-04-12
打赏
举报
回复
建议不要用mfc,好象可移植性不行.
aobai219
2007-04-12
打赏
举报
回复
mark
fantiyu_sr
2007-04-12
打赏
举报
回复
写过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
ringphone
2007-04-12
打赏
举报
回复
mark
jemmylau
2007-04-11
打赏
举报
回复
感谢大家。讨论的很细,我想很多朋友可以通过该帖子了解一下HTTP。
HTTP是建立在TCP上的超文本传输协议。
skywoodsky
2007-04-09
打赏
举报
回复
http头里有个connection的关键字的,如果是close状态,那就是服务器主动关闭了连接
珍惜生命远离CPP
2007-04-09
打赏
举报
回复
我记得这个close是在http的头部信息,和 200 OK是一样的.
jovia
2007-04-09
打赏
举报
回复
:)HTTP是应用层协议,在TCP之上才能工作。真正建立连接和断开连接都是由TCP来完成的,所以说到连接问题,自然要和TCP扯上了。
systemthink
2007-04-09
打赏
举报
回复
不错不错,学习学习!
Writer
2007-04-09
打赏
举报
回复
汗,楼主问的问题HTTP的细节问题,怎么这么多人和TCP拉上了。
HTTP是请求-响应模式的,而有时候会以关闭连接来表示数据发送完毕,所以在其协议定义中有个字段来表示谁关闭连接。
HTTP1.0/1.1都支持持久连接
在1.1中,如果客户端在请求中使用Connection: Close ,服务器端就会在发送完响应后从容关闭连接。但是即使客户端要求使用持久连接,但是服务器也有权在响应完请求后主动关闭连接,但是要在响应头在包含Connection: Close 。
1.0和1.1一样,但是HTTP1.1默认是持久连接的,而且HTTP1.0不是。
刚才查资源得的结果,有错请指出。
jovia
2007-04-08
打赏
举报
回复
你可以在用程序测试的时候,用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连接时,内存可能会被占用很多。
你可以权衡一下,然后决定是由客户端还是服务端主动断开连接。
minger909
2007-04-08
打赏
举报
回复
可以是任何一方主动断开。
就像你编过的CS其他程序一样。
一旦一方确认信息发送完闭,就可以Close()。另一方同样会接收到FD_CLOSE消息的。只要在Close()中处理你的释放工作就可以了。
BOYGUARD110
2007-04-06
打赏
举报
回复
mark
roger_77
2007-04-05
打赏
举报
回复
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
roger_77
2007-04-05
打赏
举报
回复
非持久连接和持久连接
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个连接是串行地建立的。我们使用并行连接可以缩短响应时间。
roger_77
2007-04-05
打赏
举报
回复
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
jemmylau
2007-04-05
打赏
举报
回复
TO: akirya
其中传输的数据都是HTTP包,应该不会包含Close字段的。
TO:minger909
我在做C/S的程序,用TCP的方式实现HTTP。您说的不保持连接,是对的,我就是想知道,不保持连接,是哪一方断开的?是IIS发送完数据进行Close的呢,还是IE接收完数据进行Close的呢。不解,也没有测试出来,就是没有收到OnClose的事件。
To:在什么地方,什么时候来处理CExpcetion呢?
Elysium
2007-04-05
打赏
举报
回复
你可以处理CException异常
minger909
2007-04-05
打赏
举报
回复
HTTP 你的意思是B/S模式的系统设计吧。
根本不存在保持连接这种说法。一个页面在刷新完闭之后,页面和服务器端即断开连接,两者不保持连接。
总感觉你是在说TCP、编程。如果是的话,双方都可以主动断开连接。
加载更多回复(2)
php
中
高级面试题(陆续收录)
这两天在复习php的面试题,陆续收录一些楼主觉得有用的php面试题。 1、什么是CSRF攻击?XSS攻击?如何防范? CSRF:跨站请求伪造,可以通过通过判断来源和加 Token 的方式来防范。 XSS:跨站脚本攻击,可以通过对内容转义和过滤来防范,还有CSP 2、在
HTTP
通讯
过程
中
,是
客户端
还是
服务端
主动
断开连接
? 三次握手和四次挥手,以及他们每步的状态。这个问题最好...
netty tcp
服务端
主动
断开
客户端
_Netty原理(A)
Netty 是一个高性能、异步事件驱动的 NIO 框架,基于 JAVA NIO 提供的 API 实现。它提供了对TCP、UDP 和文件传输的支持,作为一个异步 NIO 框架,Netty 的所有 IO 操作都是异步非阻塞的,通过 Future-Listener 机制,用户可以方便的
主动
获取或者通过通知机制获得 IO 操作结果。1. Netty 高性能在IO编程
过程
中
,当需要同时处理多个
客户端
接入请求...
C#Tcp
服务端
主动
断开,
客户端
无法感知问题
服务端
使用tcplistener接收连接请求。
客户端
使用tcpclient.connect
主动
连接。 在一对一的情况下(1个
服务端
只连接1个
客户端
时),
服务端
调用client.Close()
主动
关闭连接后,
客户端
接收函数(revString = br.ReadString();)立马报异常,因此可通过捕获此异常来进行重连操作。 但是,当一对多的情况下(1个
服务端
同时连接多个
客户端
),
服务端
对所有的client调用client.Close()
主动
关闭连接后,经常有少数(一般是一个)
客户端
无法捕获上面的异常
TCP Socket
通讯
基础:
客户端
与
服务端
实现
本文还有配套的精品资源,点击获取 简介:TCP协议是面向连接、可靠和基于字节流的传输层通信协议,广泛应用于互联网通信
中
。通过socket接口,TCP允许
客户端
和
服务端
之间进行数据交换。源代码包括
客户端
和
服务端
两个部分,其
中
客户端
负责创建socket、解析地址、连接服务器、发送和接收数据,最终关闭连接。
服务端
则创建监听socket、接受连接请求、处理
客户端
请求,并进行响应和关...
计算机网络 | 10.[TCP篇] TCP连接的断开(四次挥手)
所谓四次挥手,是指
客户端
和
服务端
在断开TCP连接的
过程
中
,总共发送了四个消息。其
中
双方都可以
主动
断开连接
。这里以
客户端
主动
断开连接
为例,展示四次挥手的完整流程:概述:
客户端
向
服务端
发送FIN表示消息发送完毕,
服务端
回复ACK表示收到,待
服务端
将剩余的消息处理完毕,就发送FIN表示消息发送完毕,最终由
客户端
回复ACK,连接正式断开。「为什么第一次挥手要有ACK=1」因为在发起第一次挥手之前,也会有
服务端
发送的消息,需要对它进行确认;「为什么第三次挥手没有ACK=1?......
网络编程
18,363
社区成员
64,187
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章