//看一下接收和发送长度
//客户端接收
n = c->recv(c, b->last, size);
0x775180 "GET / HTTP/1.1\r\nHost: localhost:8888\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.9) Gecko/20110412 CentOS/3.6.9-2.el6.centos Firefox/3.6.9\r\nAccept: text/html,application/xhtml+xml,"...
//客户端发送给后端服务器前,被翻译(解析)成后端代理服务器的url
writev
0x725590 "GET / HTTP/1.0\r\nHost: tomcat_server\r\nConnection: close\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.9) Gecko/20110412 CentOS/3.6.9-2.el6.centos Firefox/3.6.9\r\nAccept: text/html,appl"...
总结,转换时代理服务器对请求说做的事就是,把请求的链接进行rewrite成反向代理的链接。
//看一下接收长度
//后端服务器返回,其实它也接受了一次把所有内容接受
n = c->recv(c, u->buffer.last, u->buffer.end - u->buffer.last);
0x726480 "HTTP/1.1 200 OK\r\nServer: Apache-Coyote/1.1\r\nAccept-Ranges: bytes\r\nETag: W/\"7446-1361175134000\"\r\nLast-Modified: Mon, 18 Feb 2013 08:12:14 GMT\r\nContent-Type: text/html\r\nContent-Length: 7446\r\nDate: Fri, "...
//发送的时候会循环放到writev里面
ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
cl->buf:
//第一次
0x725be8 "HTTP/1.1 200 OK\r\nServer: nginx/1.0.12\r\nDate: Fri, 22 Feb 2013 01:21:25 GMT\r\nContent-Type: text/html; charset=utf-8\r\nTransfer-Encoding: chunked\r\nConnection: keep-alive\r\nVary: Accept-Encoding\r\nETag: W/\""...
//第二次
0x7260c0 "ae6\r\n"
//第三次
0x6e7f20 "\037\213\b"
//第四次
0x78f1a0 "\305Y\371o\033\271\025\376\071\376+\230Iws@\322\370h\220D\221\265U|\300\332\372H-\245\351b\261XP3\224\304d4\234\220\034\313n\261\377{\277GR\322\214$\aq\333\240\006\022\035C>\276\343{\a?u\036\067\233;\214\235\313D\344F\244\314*f\247\202\365\n\236\340e\240\306v\316\265`\247\252\314Sn\245\312\331\263\336\340\364\071\303G\241\231\312\005S\232\315\224\026\020\222\250\334j9*-\276\312\274@\306'Z\210\231\310\255i16\020\302I\277\274\032\366\217N\330Xf\202\245\322\370M8|.\355\024r\354T\032\066W\372\063\033C\022OSI\a\363\214\311\034_\314\274\032ZL\270Ne>\301\261\305\235\226\223"...
//第五次
0x4c5390 "\r\n0\r\n\r\n"
//发送长度
send = 3095
//可见是一次性发送,这里发送的是文字的内容
//相关设置后
if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,(const void *) &tcp_nodelay, sizeof(int)) == -1) fd = 9
ngx_reusable_connection(c, 1);
//接收图片信息,客户端发起接受图片信息(tomcat的做法吧)
//客户端给服务器发送
n = recv(c->fd, buf, size, 0); c->fd = 9
0x775180 "GET /tomcat.gif HTTP/1.1\r\nHost: localhost:8888\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.9) Gecko/20110412 CentOS/3.6.9-2.el6.centos Firefox/3.6.9\r\nAccept: image/png,image/*;q=0."...
//发送前
0x725590 "GET /tomcat.gif HTTP/1.0\r\nHost: tomcat_server\r\nConnection: close\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.9) Gecko/20110412 CentOS/3.6.9-2.el6.centos Firefox/3.6.9\r\nAccept: imag"...
//这里需要重新链接后端服务器
//给服务器发送
rc = writev(c->fd, header.elts, header.nelts); fd = 10
//客户端然后接受
n = c->recv(c, u->buffer.last, u->buffer.end - u->buffer.last);
0x7851a0 "HTTP/1.1 200 OK\r\nServer: Apache-Coyote/1.1\r\nAccept-Ranges: bytes\r\nETag: W/\"1934-1361175134000\"\r\nLast-Modified: Mon, 18 Feb 2013 08:12:14 GMT\r\nContent-Type: image/gif\r\nContent-Length: 1934\r\nDate: Fri, "...
0x725aa8 "HTTP/1.1 200 OK\r\nServer: nginx/1.0.12\r\nDate: Fri, 22 Feb 2013 01:21:25 GMT\r\nContent-Type: image/gif\r\nConnection: keep-alive\r\nAccept-Ranges: bytes\r\nETag: W/\"1934-1361175134000\"\r\nLast-Modified: Mon, 18 "...
//然后分别给客户端发送
总结:
接受,只会接受一次;客户端请求接受后,解析成后端代理服务器的地址,发送给客户端;后端服务器返回内容后,也只接受一次(tomcat服务器会根据图片进行重新请求,重新链接)
发送,除了错误会用sendfile发送文件,同时发送文件头外;后端服务器的发送会组合成writev进行一次发送。
阅读(3552) | 评论(0) | 转发(0) |