免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 55263 | 回复: 48
打印 上一主题 下一主题

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

论坛徽章:
49
15-16赛季CBA联赛之福建
日期:2016-06-22 16:22:002015年亚洲杯之中国
日期:2015-01-23 16:25:12丑牛
日期:2015-01-20 09:39:23未羊
日期:2015-01-14 23:55:57巳蛇
日期:2015-01-06 18:21:36双鱼座
日期:2015-01-02 22:04:33午马
日期:2014-11-25 09:58:35辰龙
日期:2014-11-18 10:40:07寅虎
日期:2014-11-13 22:47:15申猴
日期:2014-10-22 15:29:50摩羯座
日期:2014-08-27 10:49:43辰龙
日期:2014-08-21 10:47:58
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-06-05 15:58 |只看该作者 |倒序浏览
获奖名单已公布,详情请看: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》一本,更多图灵新书,点击这里

作者: (日)上野 宣   
译者: 于均良
丛书名: 图灵程序设计丛书
出版社:人民邮电出版社
ISBN:9787115351531
上架时间:2014-4-10
出版日期:2014 年5月
开本:32开
页码:250

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

论坛徽章:
0
2 [报告]
发表于 2014-06-05 16:02 |只看该作者
沙发我的。HHTP真的叠成出一本书。

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
3 [报告]
发表于 2014-06-05 17:23 |只看该作者
这方面接触不多,返回码之前有看到一个挺有趣的科普故事,不过也没什么印象了。

论坛徽章:
0
4 [报告]
发表于 2014-06-05 17:29 |只看该作者
还真不了解。

论坛徽章:
0
5 [报告]
发表于 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


评分

参与人数 1可用积分 +2 收起 理由
platinum + 2 赞一个!

查看全部评分

论坛徽章:
17
戌狗
日期:2013-09-02 23:43:02技术图书徽章
日期:2014-04-29 14:16:02技术图书徽章
日期:2014-04-24 15:51:26未羊
日期:2014-04-06 22:10:30丑牛
日期:2014-04-06 21:23:29辰龙
日期:2014-04-06 21:20:22处女座
日期:2014-04-06 21:16:18技术图书徽章
日期:2014-04-02 15:10:51金牛座
日期:2014-03-10 22:26:18巨蟹座
日期:2014-02-17 17:12:12技术图书徽章
日期:2014-01-24 10:38:43摩羯座
日期:2013-11-29 18:00:18
6 [报告]
发表于 2014-06-05 17:52 |只看该作者
了解点,占位支持好话题。

论坛徽章:
5
亥猪
日期:2013-10-15 13:41:04CU十二周年纪念徽章
日期:2013-10-24 15:41:34申猴
日期:2013-10-28 10:55:45辰龙
日期:2013-10-31 13:29:29丑牛
日期:2014-02-14 11:25:54
7 [报告]
发表于 2014-06-05 18:14 |只看该作者
遇到過 HTTP 報文被改寫了
原來的 Content-Length 被改成了 0

解決麼? 無解

论坛徽章:
0
8 [报告]
发表于 2014-06-05 19:41 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
2
水瓶座
日期:2014-06-12 08:22:39IT运维版块每日发帖之星
日期:2015-08-05 06:20:00
9 [报告]
发表于 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:op( aXmlBuffer ); // aXmlBuffer

        CleanupStack:opAndDestroy( &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给服务器的时候服务器还有返回信息才会走。。。。

论坛徽章:
40
水瓶座
日期:2013-08-15 11:26:422015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之乌兹别克斯坦
日期:2015-03-27 14:01:172015年亚洲杯之约旦
日期:2015-03-31 15:06:442015亚冠之首尔
日期:2015-06-16 23:24:37IT运维版块每日发帖之星
日期:2015-07-01 22:20:002015亚冠之德黑兰石油
日期:2015-07-08 09:32:07IT运维版块每日发帖之星
日期:2015-08-29 06:20:00IT运维版块每日发帖之星
日期:2015-08-29 06:20:00IT运维版块每日发帖之星
日期:2015-10-10 06:20:00IT运维版块每日发帖之星
日期:2015-10-11 06:20:00IT运维版块每日发帖之星
日期:2015-11-10 06:20:00
10 [报告]
发表于 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即可知道,
  1. RFC 1945 - Hypertext Transfer Protocol -- HTTP/1.0
  2. http://www.w3.org/Protocols/rfc1945/rfc1945
  3. RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1
  4. http://www.w3.org/Protocols/rfc2616/rfc2616
复制代码
4、你知道各种 HTTP 返回码的实际意义吗?
是的,大部分的返回码还是知道的,因为使用Ajax技术就有必要知道返回码的含义,以便于根据对应的状态码进行相应地回调操作。

我只说下ajax编程中的5个状态吧,其实和HTTP的状态位是对应的,其他的返回码直接查询下列表即可。
  1. 0 - (未初始化)还没有调用send()方法
  2. 1 - (载入)已调用send()方法,正在发送请求
  3. 2 - (载入完成)send()方法执行完成
  4. 3 - (交互)正在解析响应内容
  5. 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可用积分 +5 收起 理由
platinum + 5 赞一个!

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP