TCP和HTTP学习笔记

TCP和HTTP的区别

TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性。Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求。Http会通过TCP建立起一个到服务器的连接通道,当本次请求需要的数据完毕后,Http会立即将TCP连接断开,这个过程是很短的。所以Http连接是一种短连接、无状态的连接,TCP连接是一种长连接、有状态的连接。所谓的无状态,是指浏览器每次向服务器发起请求的时候,不是通过一个连接,而是每次都建立一个新的连接。如果是一个连接的话,服务器进程中就能保持住这个连接并且在内存中记住一些信息状态。而每次请求结束后,连接就关闭,相关的内容就释放了,所以记不住任何状态,成为无状态连接。

TCP连接

当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次握手的,而释放则需要4次握手,所以说每个连接的建立都是需要资源消耗和时间消耗的。
TCP的三次握手
所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立
TCP的三次握手
第一次握手:客户端将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给服务器,客户端进入SYN_SENT状态,等待服务器确认。
第二次握手:服务器收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给客户端以确认连接请求,服务器进入SYN_RCVD状态
第三次握手:客户端收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给服务器,客户端检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器进入ESTABLISHED状态,完成三次握手

注意: 第三次握手是有可能失败的,如果失败的话,服务器方面一直没有等到ack,那么会重新发送syn+ack给客户端,请求成功并且受到ack包,那么连接建立成功了;客户端方面会考虑是否在一定时间内发送了请求,如果发送了请求,发现服务器并没有响应,发现了异常;如果没有发送请求,超过了一定时间,可以说并没有建立连接
注意: SYN攻击:
在三次握手过程中,Server发送SYN-ACK之后,收到Client的ACK之前的TCP连接称为半连接(half-open connect),此时Server处于SYN_RCVD状态,当收到ACK后,Server转入ESTABLISHED状态。SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,由于源地址是不存在的,因此,Server需要不断重发直至超时,这些伪造的SYN包将产时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。SYN攻击时一种典型的DDOS攻击,检测SYN攻击的方式非常简单,即当Server上有大量半连接状态且源IP地址是随机的,则可以断定遭到SYN攻击了,使用如下命令可以让之现行:
#netstat -nap | grep SYN_RECV

tcp的四次挥手
所谓四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发
四次挥手
第一次挥手:客户端主动关闭,发送FIN,请求服务器关闭连接,客户端处于FIN_WAIT_1状态
第二次挥手:服务器收到FIN,发送ack给客户端,序列号为收到的FIN+1,服务器姿势处于CLOSE_WAIT状态
第三次挥手:服务器发送FIN包,用来确认客户端和服务器的关闭,服务器处于LAST_ACK状态
第四次挥手:客户端收到FIN包,处于TIME_WAIT,发送ack给服务器,序列号为收到的FIN+1,服务器收到ack包后处于,变成CLOSED状态,完成四次挥手

问:为什么建立连接是三次握手,而断开连接却需要四次挥手?
因为服务器处于listen状态,当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的

HTTP连接

短连接指建立SOCKET连接后发送后接收完数据后马上断开连接,一般银行都使用短连接解释。
长连接就是指在基于tcp的通讯中,一直保持连接,不管当前是否发送或者接收数据
短连接
在HTTP/1.0中,默认使用的是短连接,也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。如果客户端浏览器访问的某个HTML或其他类型的 Web页中包含有其他的Web资源,如JavaScript文件、图像文件、CSS文件等;当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话。
长连接
因为随着html的页面复杂程度越来越大,短连接的http协议满足不了现在的需求,所以在http/1.1,默认使用的是长连接,使用长连接的HTTP协议,会在响应头有加入这行代码:

connect:keep-alive
keep-alive:timeout=20

在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的 TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,上述的timeout=20代表保持时间为20秒。实现长连接要客户端和服务端都支持长连接
长轮询
长轮询就是http发送一个请求,如果有数据就马上响应,如果没有就不响应;如果没有响应的话,就会hold一段时间,等过了一段时间再继续发送http请求。
http 长轮询的局限:
浏览器端对统一服务器同时 http 连接有最大限制, 最好同一用户只存在一个长轮询;
服务器端没有数据 hold 住连接时会造成浪费, 容易产生服务器瓶颈
短轮询
短轮询就是http发送一个请求,不管有没有数据,都会马上响应,然后hold一段时间之后,再重新发送http请求。
http 短轮询的局限是实时性低
两者相同点:
可以看出 http 长轮询和 http 短轮询的都会 hold 一段时间;
两者不同点
间隔发生在服务端还是浏览器端: http 长轮询在服务端会 hold 一段时间, http 短轮询在浏览器端 “hold” 一段时间;

总结

套用一段话来说就是,IP协议就相当于一条有路标的高速公路,而TCP/UDP协议就相当于公路上的大卡车,而http协议、file协议就想当与是卡车上的”货物”。


参考地址:

[1] http://blog.sina.com.cn/s/blog_70899b710101azb5.html
[2] http://blog.csdn.net/ls5718/article/details/51757467

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值