TCP协议
1.OSI与TCP/IP各层的结构和功能,协议和作用。
OSI七层模型对应TCP/IP四层模型,只是分法不同而已。
应用层:提供应用层服务,文件传输(FTP),电子邮件(SMTP), 主要的协议还有HTTP(超文本传输协议),DNS,和telnet
表示层:用于数据格式化,代码转换,数据加密,没有协议
会话层:解除或建立与别的接点的联系,没有协议
传输层:TCP UDP
网络层: IP ICMP(ping主要实现), OSPF(全局泛洪,主要用于IP选路)
数据链路层 ARP(地址解析协议,根据IP地址获得MAC地址)
物理层:
按照TCP/IP分的话,就四层,挺好记的,应用层,传输层,网络层还有不知道叫什么名字,主机到网络层?(包含物理层和数据链路层)
2.TCP和UDP有什么区别?
TCP是传输控制协议,提供的是面向连接的,可靠地字节流服务。实际数据传输之前服务器和客户端要进行三次握手,会话结束后结束连接。UDP是用户数据报协议,是无连接的。因为无连接,而且没有超时重发机制,所以UDP传输速度很快。主要用于视频传输(但其实现在各大视频商都是用HTTP协议,而HTTP是基于TCP),实时视频。
TCP保证数据按序到达,提供流量控制和拥塞控制,在网络拥堵的时候会减慢发送字节数,而UDP不管网络是否拥堵。
TCP是连接的,所以服务是一对一服务,而UDP可以1对1,也可以1对多(多播),也可以多对多。
3.TCP 的三次握手与四次挥手过程,各个状态名称与含义, TIMEWAIT 的作用。 TCP 的三次握手过程?为什么会采用三次握手,若采用二次握手可以吗?
假设A是客户端,B是服务端。A首先向B发出连接请求报文段,这个时候首部中的同步位SYN=1,同时选择一个初始的序号x。此时报文段不能携带数据。此时A进入到SYN_SENT(同步已发送)状态。
B受到连接请求报文,同意建立连接,向A发出确认。确认报文中,SYN和ACK都置1,确认号是x+1,与此同时,自己选择一个初始序号y,这个报文也不能携带数据。此时B进入SYN_RCVD(同步收到)状态。
A收到B的确认后,还要给B确认。这时可以携带数据,A进入到ESTABLISHED状态。这就是三次握手的过程。
那如果两次握手会怎么样呢?
就是A为什么还要发送一次确认。为了防止已经失效的连接请求报文又突然传送到了B,而产生错误。假设一种异常,A发出的请求由于网络阻塞没有及时到达B,后又重传请求,之后B响应了,且建立了连接,之后连接又释放了。此时假设A发出的第一个请求到达B,B误以为是A再次请求连接,B建立连接,如果采用两次握手,此时连接建立,而A又不发送数据,浪费了B的资源。
TCP的四次挥手
数据传输结束后,通信双方都可以释放连接。现在A和B都处于ESTABLISHED状态,A的应用进程向其TCP发出连接释放报文段,主动关闭TCP连接。A进入FIN_WAIT1(终止等待1)状态。然后B确认,B进入CLOSE_WAIT(关闭等待)状态。此时TCP处于半关闭状态,A已经没有数据要发送了,如果B仍要发送数据,B仍然接收。A收到B的确认后,就进入FIN_WAIT2(终止等待2)状态,等待B发出连接释放报文。 如果B已经没有向A发送的数据,则B发送请求释放报文,B进入LAST_ACK(最后确认)阶段,等待A的确认。A在收到B的请求后,要发出确认,然后进入TIME_WAIT(时间等待)状态。此时,连接还未释放,必须等待时间等待计时器设定的时间的2MSL后,A才进入CLOSED状态。
为什么最后要等一个TIME_WAIT时间呢?一:为了保证最后一个ACK能够到达B,防止丢失了,B重传,A不能回复确认。二是为了防止之前提到的“已经失效的连接请求报文段“出现在连接中”。A发送完最后一个ACK,再经过时间2MSL,可以使本连接产生的所有请求报文从网络中消失。
4.TCP拥塞控制
拥塞控制就是防止过多的数据注入到网络中,这样使得网络中的路由器或者链路不至于过载。TCP拥塞控制方法主要包括:慢开始,拥塞避免,快重传和快恢复。
慢开始是指发送方先设置cwnd=1,一次发送一个报文段,随后每经过一个传输轮次,拥塞串口cwnd就加倍,其实增长并不慢,以指数形式增长。还要设定一个慢开始门限,当cwnd>门限值,改用拥塞避免算法。拥塞避免算法使cwnd按线性规律缓慢增长。当网络发生延时,门限值减半,拥塞窗口执行慢开始算法。
之后又提出了快重传和快恢复
当接收方收到失序的报文段,按照快重传,需要尽快发送对未收到的报文段的重复确认。快恢复是指当拥塞串口达到门限值,不直接开启慢启动算法,而是快恢复,快恢复就是收到三个重复的确认(可看作是网络已经拥塞了),此时并不执行慢开始算法,而是执行快恢复,就是新的门限值是原来的一半,直接进入拥塞避免阶段。
5.滑动窗口协议和回退n针协议
发送方和接收方都维护一个数据帧序列,这个序列叫窗口。
发送方的窗口由接收方确定,目的在于控制发送速度,以免接受方缓存不够大,而导致溢出。这其实属于流量控制范畴。如图,接收方告诉发送方,建议滑动窗口为6,(否则太大一次发送太大,我接收缓冲区太小,处理不过来),然后发送方可以一次发送6个数据帧,假设已经发送了4,5,6,但是没收到关联的ACK,7,8,9则等待发送,如果此时发送端收到4号ACK,则窗口向右收缩,此时窗口就“滑动”了
滑动窗口协议是理论,可以用的是后退n针协议。发送方一次发送比如说10个帧,前两个针都返回了对应的ACK,数据帧2出现了错误,这时发送方被迫重新发送2-8这七个帧,这就是回退n帧协议。但是如果接收方已经接收到了3-8帧,只是丢失了2帧,全部重传太浪费网络条件了,所以有时候会选择重传丢失的的帧。这就是选择重传协议。
HTTP协议
HTTP报文结构
HTTP有两类报文:
1)请求报文
2)响应报文
HTTP的请求报文和响应报文由三个部分组成。
1)开始行。用于区分是请求报文还是响应报文。在请求报文中的开始行叫做请求行,在响应报文中的开始行叫做状态行
2)首部行,用于说明浏览器,服务器或报文主体的一些信息
3)实体主体
常见状态码和含义
状态码都是三位数字的,分为5大类共33种
1xx:表示通知消息,如请求收到了或者正在进行处理
2xx:表示成功,如接受或知道了
3xx:表示重定向,如要完成请求还要继续采取行动
4xx:表示客户的差错,如请求由错误的语法或不能完成
5xx:表示服务器差错
200:客户端请求成功
400:bad request 客户端请求错误
403:Forbidden 服务器收到请求,但是拒绝提供服务
404:Not found 请求资源不存在
500:Internal Server Error 服务器发生不可预期错误
503:服务器当前不能处理客户端请求
HTTP请求的几种类型
GET 请求读取由URL所标志的信息
HEAD 请求读取由URL所标志的信息的首部
POST 给服务器添加信息
PUT在指明的URL下存储一个文档
CONNECT 用于代理服务器
HTTP1.1和HTTP1.0的区别
HTTP1.0每请求一个文档就要建立TCP连接,有几次握手的时间花销,如果一个主页上有很多链接的对象需要依次进行连接,每次连接下载都要消耗这些开销。
HTTP1.1采用持续连接。所谓持续连接就是服务器在发送响应后仍然在一段时间内保持这条连接。使得后序的请求和响应报文都在这条连接上进行