TCP
- 窗口大小的作用:就是流量控制和拥塞控制用的。
TCP包类型
- SYN:建立连接
- FIN:表示关闭连接
- ACK:表示响应,ACK位置1时,确认号才有用。
- PSH:表示有DATA数据传输
- RST:表示连接重置
TCP三次握手
客户端发送SYN包告知服务器建立连接,同时包中帧序号为(算法生成的)初始M值,也叫ISN。服务器收到SYN标志后即可知道是建立连接的操作,然后会回复一条帧,该帧将SYN、ACK都置位了(因为在数据包中加入ACK也只是将ACK置1,并携带上确认号。并且该SYN + ACK的这种其他类型包携带ACK的现象也叫做延迟确认)。服务器回复帧中帧序号N是服务器端生成的,而确认号则是客户端传入的M + 1。因为TCP是全双工的,所以两端都需要有各自独立的帧序号。最后,客户端回复服务器一个ACK(该ACK也可能携带有数据),表示建立完成。
为什么要存在帧序号机制
双方独立的帧序号,都是通过一定的算法生成一个初试ISN。并且请求和ACK帧会携带确认号
- 防止伪造TCP包
- 防止新老数据混淆。(发数据断网,然后重连TCP,结果老数据到达引起的)
- 断网重传(在重试限制次数到达前网络恢复了,那么服务器可继续解析ACK,将缓存的数据发给应用程序)
TCP四次挥手
这里其实不应该分为客户端和服务器,应该是哪个主动关闭哪个就是左边的
因为TCP连接是双向的,客户端发送一个FIN,仅表示该客户端不再发送数据了(但是可以接收),那么服务器会响应。然后如果服务端发送完了数据,他就会发送FIN来告知客户端服务器的连接也终止了。
TCP状态转换图
ESTABLISHED 状态再往下转移时,下面的虚线实线就不是区别服务器客户端的了(失去了区分的作用),而是说谁发起主动关闭,谁就会进入FIN_WAIT1状态,谁被动关闭,谁就会进入CLOSE_WAIT状态。
- CLOSING状态是指双发同时发送了关闭,双方都是主动方,那么双方都会进入TIME_WAIT状态
双方主动关闭的过程:
这样服务器才会有TIME_WAIT的限制。
- 服务器端主动关闭则服务器端的TCP就会进入TIME_WAIT状态
TCP补充
流量控制
防止快速的发送者将慢速的接收者击垮。主要是控制接收缓冲区,每次收到数据在回复确认消息时,需要带上发送者可以发送多少字节,采用滑动窗口算法。
拥塞控制
防止快速的发送者将整个网络击垮。TCP采用了慢启动和拥塞避免算法,最终的作用是让数据传输快速到达一个平衡的状态,即发送者发送速度和接收确认的速度一致.
整个算法组合的感觉就是一条s型曲线,一开始平缓,然后指数增长,再回归平缓
粘包
造成问题的原因:1.发送端需要等到缓冲区满了才会发送出去(TCP的Nagle算法造成的)。2.接收方不及时接收缓冲区内的包
HTTP协议
基础
URI
URI:统一资源标识符。相当于一个抽象概念,其目前有两种实现:
- URL:统一资源定位符:精确的说明了某资源的位置以及如何去访问它。现在基本所有的URI都是URL。
- URN:(目前处于实验阶段),统一资源名。根据唯一名称来访问资源,而与资源所在地无关
HTTP报文格式
请求报文
起始行:<method> <URL> <version> CRLF 首部:<header> CRLF CRLF 主体:<entity-body>
其中:CRLF表示回车换行符
2.响应报文
<version> <status> <reason>CRLF
<header>CRLF
CRLF
<entity-body>
系统状态码
- 1xx:信息提示
- 2xx:成功
- 3xx:重定向
- 4xx:客户端错误
- 5xx:服务器端错误
常见状态码
- 302:临时重定向;资源换到了其他位置,可能还会再变
- 400:bad request;请求参数等不正确
- 401:没带认证信息或者认证失败
- 403:资源禁止访问
- 404:未找到
HTTP性能
TCP连接的握手延迟
因为要三次握手,所以如果建立连接后就发送少量数据随即关闭就不好。所以现在HTTP1.1以后默认开启持久连接,即HTTP请求完成后不会关闭连接,然后客户端又会实现类似连接池的功能,二者配合,再加上管道化技术,即不必等一条请求响应后再发送下一条,可以连续发送多条。
TCP慢启动
TCP允许传输的最大速度起初会有限制,随后时间的推移,传输速度会逐渐加大。所以新连接的速度会比已经在的要慢。
延迟确认
TCP协议规定:每收到一个TCP段时,都需要向发送方回复一个ack。而TCP允许将ack和发送信息结合在一起。
所以,当接收端回复ack时,会有一个最大延迟时间(100~200ms),在该时间内如果接收方有发往上次发送方的数据,那么就将ack和数据一起发送。否则,在超出该时间后,再回复一个单独的ack.
Nagle算法
试图在发送一个TCP段前,将多个TCP数据绑定在一起,以提高网络效率。所以如果HTTP报文较小,可能需要等待多个报文才进行发送,而又由于延迟确认的限制,导致整个发送会有较大延迟。
TIME_WAIT累积
主要是为了保证连接的正确关闭,由此带来的是在关闭连接后,会在2MSL周期内不允许相同的TCP连接再进行建立。所以如果存在大量的快速的建立关闭连接,那么会导致服务器上的TCP连接大都处于TIME_WAIT状态,所以就无法及时建立连接。