send_linux 发表于 2014-06-05 15:58

您了解HTTP么?工作中奇葩HTTP问题经验大征集!(获奖名单已公布-2014-7-9)

获奖名单已公布,详情请看:http://bbs.chinaunix.net/thread-4145264-1-1.html

活动背景:
你了解 HTTP 吗?
你认为你真的很了解 HTTP 吗?
你知道 HTTP/1.0 和 HTTP/1.1 的区别吗?
你知道各种 HTTP 返回码的实际意义吗?
你知道各种 Request Header 和 Response Header 里多种字段的含义吗?
你又了解 SPDY 吗?
《图解 HTTP》这本书会把上述问题剖析得淋漓尽致,尤其对于互联网运维的小伙伴们,真的是一本值得学习和参考的佳作!

本期话题:
说说你在学习、工作中遇到的 HTTP 的那些奇葩事(阐述清楚问题,并说明是如何解决的)

活动时间:
2014年6月5日-6月25日

本期嘉宾:
ChinaUnix资深版主:platinum

活动奖品:
从中抽取5名用户,获得《图解HTTP》一本,更多图灵新书,点击这里
http://images.china-pub.com/ebook3765001-3770000/3769819/zcover.jpg
作者: (日)上野 宣   
译者: 于均良
丛书名: 图灵程序设计丛书
出版社:人民邮电出版社
ISBN:9787115351531
上架时间:2014-4-10
出版日期:2014 年5月
开本:32开
页码:250

活动要求:
1、 要言之有物,不能低于20个字。
2、 本次话题主要关注http及运维相关的技术讨论,其他问题可能不做重点

yunas 发表于 2014-06-05 16:02

沙发我的。HHTP真的叠成出一本书。

seesea2517 发表于 2014-06-05 17:23

这方面接触不多,返回码之前有看到一个挺有趣的科普故事,不过也没什么印象了。

东北胖子 发表于 2014-06-05 17:29

还真不了解。

jbqncn 发表于 2014-06-05 17:31

本帖最后由 jbqncn 于 2014-06-13 10:05 编辑

你了解 HTTP 吗?
有点了解
你认为你真的很了解 HTTP 吗?
不太深入
你知道 HTTP/1.0 和 HTTP/1.1 的区别吗?
主要区别有三个这个是当年毕业设计做简单HTTP服务器学到的。
一个是支持虚拟主机(主要是依靠Host头)。
一个是支持keepalive就是在一个TCP连接里可以发多个HTTP请求,这样就要求每个HTTP请求都要有content-length来定界。
还有一个记不太清了。。
你知道各种 HTTP 返回码的实际意义吗?
1xx 代表消息类型
2xx 代表成功
3xx 代表重定向
4xx 代表客户端发来的请求有误
5xx 代表服务器内部错误
你知道各种 Request Header 和 Response Header 里多种字段的含义吗?
有些HTTP头即可以出现在Request里,也可以出现在Response里,比如content-length
有些HTTP则只出现在一类消息中比如 server ?
HTTP1.1里头太多了,等要用到了再研究吧。
你又了解 SPDY 吗?
SPDY是HTTP2.0是哪几个字母的缩写或者主要有什么改进都不太清楚,主要是现在也没大规模应用,所以也没了解太深,不过貌似很多HTTP服务器有支持。
以上回答全部错误,就连SPDY不是缩写也被明显指出。http://zh.wikipedia.org/wiki/SPDY


jimmy-_-lixw 发表于 2014-06-05 17:52

了解点,占位支持好话题。

lkk_super 发表于 2014-06-05 18:14

遇到過 HTTP 報文被改寫了
原來的 Content-Length 被改成了 0

解決麼? 無解

chenzhiquan2000 发表于 2014-06-05 19:41

陌路巨额投入 发表于 2014-06-05 20:53

回复 1# send_linux


    前段时间想通过HTTP来上传文件,发生了一件奇葩事,,哈哈。。不多说直接上代码:
void COSBHTTPClient::UploadFile( TOSBDownloadParam& aParam, TDesC8& aContentType )

//aContentType= “multipart/form-data; boundary=AaB03x”

{

      iClient->CancelTransaction();

      

      RFile rFile;

      RFs fs;

      if( KErrNone != fs.Connect() )

      {

                return;

      }



      //Open file where the stream text is

      TInt error = rFile.Open( fs, iDownloadParam->iFileName, EFileShareAny );//EFileRead );

      CleanupClosePushL( rFile );

      TInt size = -1;

      User::LeaveIfError( rFile.Size( size ) );      

      HBufC8* aXmlBuffer = HBufC8::NewLC( size );

      TPtr8 bufPtr( aXmlBuffer->Des() );

      error = rFile.Read( bufPtr );

      CleanupStack::Pop( aXmlBuffer ); // aXmlBuffer

      CleanupStack::PopAndDestroy( &rFile ); // rFile

      fs.Close();

      _LIT8(KDataStart,"--AaB03x");

      _LIT8(KCrlf,"\r\n");

      _LIT8(KContent,"Content-Disposition: form-data; name='userfile'; filename='");

      _LIT8(KFileCompletion,"'");

         

      _LIT8(KContent2,"Content-Type: text/plain");

      _LIT8(KContent3,"Content-Transfer-Encoding: binary");

      _LIT8(KDataEnd,"--AaB03x--");

         

      HBufC8* iPostData = HBufC8::NewL( 650+ size );

         

      TPtr8 iPostDataPtr = iPostData->Des();

      iPostDataPtr.Zero();

         

      iPostDataPtr.Append(KCrlf);

      iPostDataPtr.Append(KDataStart);

      iPostDataPtr.Append(KCrlf);

      iPostDataPtr.Append(KContent);

//      iPostDataPtr.Append(aFname);

      iPostDataPtr.Append(KFileCompletion);

      iPostDataPtr.Append(KCrlf);

      iPostDataPtr.Append(KContent2);

      iPostDataPtr.Append(KCrlf);

      iPostDataPtr.Append(KContent3);

      iPostDataPtr.Append(KCrlf);

      iPostDataPtr.Append(KCrlf);

      iPostDataPtr.Append(bufPtr); //the file in binary

      iPostDataPtr.Append(KCrlf);

      iPostDataPtr.Append(KDataEnd);

      iPostDataPtr.Append(KCrlf);

      iClient->IssueHTTPPostL(URL, aContentType, iPostDataPtr);

      iObserver.ClientEvent( MOSBHTTPClientObserver::EEventConnecting );

}
复制代码void CClientEngine::IssueHTTPPostL( const TDesC8& aUri,

                const TDesC8& aContentType, const TDesC8& aBody )

{

      SetupConnectionL();



      // Parse string to URI

      TUriParser8 uri;

      TInt ret = uri.Parse( aUri );

      // Copy data to be posted into member variable; iPostData is used later in

      // methods inherited from MHTTPDataSupplier.

      delete iPostData;

      iPostData = aBody.AllocL();

      // Get request method string for HTTP POST

      RStringF method = iSession.StringPool().StringF(HTTP::EPOST, RHTTPSession::GetTable());



      // Open transaction with previous method and parsed uri. This class will

      // receive transaction events in MHFRunL and MHFRunError.

      iTransaction = iSession.OpenTransactionL( uri, *this, method );

      // Set headers for request; user agent, accepted content type and body's

      // content type.

      RHTTPHeaders hdr = iTransaction.Request().GetHeaderCollection();

      SetHeaderL( hdr, HTTP::EUserAgent, KUserAgent );

      SetHeaderL( hdr, HTTP::EAccept, KAccept );

      SetHeaderL( hdr, HTTP::EContentType, aContentType );

      // Set this class as an data supplier. Inherited MHTTPDataSupplier methods

      // are called when framework needs to send body data.

      MHTTPDataSupplier* dataSupplier = this;

      iTransaction.Request().SetBody( *dataSupplier );

      // Submit the transaction. After this the framework will give transaction

      // events via MHFRunL and MHFRunError.

      iTransaction.SubmitL();

}
复制代码void CClientEngine::MHFRunL( RHTTPTransaction aTransaction,

                const THTTPEvent& aEvent )

{



}
复制代码现在与服务器的连接可以成功,但是body总是传不上去,从log看MHFRunL的aEvent,走了下面3种状态
THTTPEvent::EGotResponseHeaders
THTTPEvent::EResponseComplete
THTTPEvent::ESucceeded
可是THTTPEvent::EGotResponseBodyData始终没有走到,自己总是以为上传失败,苦苦纠结了一个下午,,,最后才发现我是POST,不走THTTPEvent::EGotResponseBodyData,除非在POST给服务器的时候服务器还有返回信息才会走。。。。
:mrgreen: :mrgreen:

forgaoqiang 发表于 2014-06-06 00:20

本帖最后由 forgaoqiang 于 2014-06-23 14:41 编辑

HTTP 还是比较了解滴 好不容易看完了《HTTP权威指南》 ~~ 哈哈 过两天从现场回去了再来讨论~

1、你了解 HTTP 吗?
对于HTTP还是比较了解的,工作中需要配置Apache和Nginx服务器,很多时候就是和HTTP在打交道,同时需要写一些Web的程序,对HTTP的各种状态操作会大大影响网络性能的。现在主要做无线这一块,AC控制器直接使用HTTPS(和HTTP相同哦)进行通讯,很多Heartbeat通讯的时候直接使用Header方式即可,没有必要使用开销很大的GET/POST方式。

2、你认为你真的很了解 HTTP 吗?
⊙﹏⊙b汗 让这个问题一问,突然没有自信了。我真的还是比较了解HTTP的,至少把《HTTP The Definitive Guide》看了个差不多,大部分内容都理解了,应该是很了解了。虽然实际生产应用中大部分的HTTP协议功能并没有使用。

3、你知道 HTTP/1.0 和 HTTP/1.1 的区别吗?
这个比较实用的两个区别还是晓得的,如下所述:
①其实最大的最有意义的区别就是 长连接的改进(Keep-alive),能够在一个HTTP连接里面传输多个文件,而不像是HTTP1.0里面每次请求都得来一遍:TCP三次握手+HTTP过程,大大的提高性能。
②“偏移”字节功能,能够支持不从0开始传输,因此能够支持所谓的断点续传,对于移动网络还是比较实用的功能,因为移动网络经常会出现不稳定的问题,只要服务器端记录了已经发送的字节数就能实现断点续传,而不用重新发送。
其实具体的区别只要查看 官方的定义文档RFC即可知道,RFC 1945 - Hypertext Transfer Protocol -- HTTP/1.0
http://www.w3.org/Protocols/rfc1945/rfc1945
RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1
http://www.w3.org/Protocols/rfc2616/rfc26164、你知道各种 HTTP 返回码的实际意义吗?
是的,大部分的返回码还是知道的,因为使用Ajax技术就有必要知道返回码的含义,以便于根据对应的状态码进行相应地回调操作。

我只说下ajax编程中的5个状态吧,其实和HTTP的状态位是对应的,其他的返回码直接查询下列表即可。0 - (未初始化)还没有调用send()方法
1 - (载入)已调用send()方法,正在发送请求
2 - (载入完成)send()方法执行完成
3 - (交互)正在解析响应内容
4 - (完成)响应内容解析完成,可以在客户端调用5、你知道各种 Request Header 和 Response Header 里多种字段的含义吗?
是的,对于一部分常用的还是很清楚的,Request请求的内容不多,主要是带上一些客户端信息以及请求的主机、方法、能接受的编码等等信息。
Response Header中包含的内容比较多,包括Content-length(用来定界)、返回的文件类型,对于网络性能比较相关的就是缓存相关的字段,比如过期时间、是否允许缓存等。

6、你有了解 SPDY 吗?
这个倒是听说过,应该是Chrome的专有技术,通过对HTTP的进行压缩(增加有效负载,和TCP/UDP那种类似),优化后的HTTP能够减少协议流量自身开销,把更多的空间留给有效的负载(高层数据),SPDY不是一堆单词的缩写,只是Speedy的缩写而已。

现在发现HTTPS长连接能够当做socket来使用,C/S结构采用高层协议HTTP来作为通讯协议,开发效率高、难度低,即使Ubnt这样的厂家的控制器都有基于HTTPS进行传输的,果然HTTP还是非常方便的,奇葩的事情有一个:
当时给建设银行的热点系统做联通短信对接,不知道为什么短信通道那边总是返回 200(代表成功)的状态码,但是content-length总是0,最后才发现是Nginx设置了时间内限制,每分钟只允许20次请求,然后就进行虚假响应,差点被坑死,使用自己的短信网关近万条才发现这个问题。

页: [1] 2 3 4 5
查看完整版本: 您了解HTTP么?工作中奇葩HTTP问题经验大征集!(获奖名单已公布-2014-7-9)