您了解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及运维相关的技术讨论,其他问题可能不做重点 沙发我的。HHTP真的叠成出一本书。 这方面接触不多,返回码之前有看到一个挺有趣的科普故事,不过也没什么印象了。 还真不了解。 本帖最后由 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
了解点,占位支持好话题。 遇到過 HTTP 報文被改寫了
原來的 Content-Length 被改成了 0
解決麼? 無解 回复 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-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次请求,然后就进行虚假响应,差点被坑死,使用自己的短信网关近万条才发现这个问题。