Bootstrap

计算机网络

##TCP与UDP
TCP提供面向连接的,可靠的数据传输服务,其数据传输的单位是报文段
UDP提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性),其数据传输的单位是用户数据报。

TCP三次握手

在这里插入图片描述
最初,两个TCP进程都处于关闭状态,一开始,TCP服务器进程首先创建TCP传输控制块,用来存储TCP连接中的重要信息(TCP连接表,指向发送和接收缓存的指针,指向重传队列的指针,当前的发送和接收序列…)TCP服务器进程进入监听状态,等待客户端进程的请求。

TCP客户进程也是首先创建传输控制块,然后在打算建立TCP连接时,向TCP服务进程发送TCP连接请求报文段,并进入同步已发送状态。TCP连接请求报文段首部同步位SYN被设置为1,表明这是一个TCP连接请求报文段。,序号字段seq被设置为一个初始值x,作为TCP客户进程所选择的初始序号。(TCP规定:SYN被设置为1的报文段不能携带数据,但要消耗掉一个序号)

TCP服务器进程接收到TCP连接请求报文段后,如果同意建立连接,则向TCP客户端进程发送TCP请求确认报文段,并进入同步已接收状态,该报文段同步位SYN被设置为1,确认位ACK也为1,表明这是一个TCP连接请求确认报文段,序号字段seq被设置为一个初始值y,作为TCP服务器进程所选择的初始序号,确认号字段ack被设置成了x+1,这是对TCP客户端进程所选择的初始序号的确认。

TCP客户进程在收到TCP连接请求确认报文段后,要向TCP服务器进程发送一个普通的TCP确认报文段,并进入连接已建立状态。该报文段首部ACK被设置为1,表明这是一个普通的TCP确认报文段,序号字段seq被设置为x+1,(这是因为,TCP客户进程第一个发送的序号字段为x,并且不携带数据,因此第二个报文段序号被设置为x+1),确认号字段ack被设置为y+1,这是对TCP服务器进程所选择的初始序号的确认。TCP服务端进程收到该确认报文段后,也进入TCP连接已建立状态。

能否两报文握手??

不能,当TCP客户端发送一个连接请求报文段后,该报文段在某个网络节点滞留了,就会造成该报文端的超时重传,假设重传的报文段被TCP服务器进程正常接收,TCP服务器进程给TCP客户端进程发送一个TCP连接请求确认报文段,并进入连接已建立状态,TCP客户端进程收到TCP连接请求确认报文段后,进入连接已建立状态,现在TCP双方都进入连接已建立状态,可以进行数据传输,当传输完毕后,双方进入关闭状态。当之前那个滞留的TCP请求报文段到达服务器进程时,TCP服务器进程会误认为这是TCP客户端又发送了一个新的请求,于是给TCP客户端进程发送一个TCP请求连接确认报文段,并进入连接已建立状态,当该报文段到达TCP客户端进程后,由于客户端未发送新的请求,并处于关闭状态,则不会理会该报文段,而TCP服务器进程以为TCP连接已经建立好了,并进入了TCP连接已建立状态,一直等待客户端进程发送数据,这将浪费TCP服务器进程所在主机的很多资源,综上所述,不能两报文握手,是为了防止已失效的连接请求报文段,突然又送达了TCP服务端进程因而导致错误。
在这里插入图片描述

四次挥手

在这里插入图片描述
TCP客户进程会发送TCP连接释放报文段,并进入终止等待1状态,该报文段的终止位FIN和确认位ACK 都被设置为1,表明这是一个TCP连接释放报文段,同时对之前收到的报文段进行确认,序号seq被设置为TCP客户进程之前已传送过的数据的最后一个字节+1,ack字段被设置为TCP客户进程已收到的数据的最后一个字段+1
TCP服务器进程收到连接释放报文段后,会发送一个普通的TCP确认报文段并进入关闭等待状态。该报文段首部中的确认位ACK设置为1,表明这是一个普通的TCP确认报文段,序号seq的值设置为TCP服务器进程之前已传送过的数据的最后一个字节序号+1,确认号ack字段设置为TCP连接释放报文段seq+1.TCP服务进程通知高层应用进程,TCP客户进程要断开与自己的连接,此时,从TCP客户进程到TCP服务进程的这个方向的连接就中断了,这时的TCP连接属于半关闭状态,也就是TCP客户进程已经没有数据要发送了。但如果TCP服务器进程仍有数据要发送,TCP客户进程仍要接受,也就是说,从TCP服务器进程到TCP客户端进程这个方向的连接并未关闭。
TCP客户端进程在接收到TCP确认报文段后进入终止等待2状态。等待TCP服务器进程发送的TCP连接释放报文段,若TCP服务器进程已经没有数据要发送了,应用进程通知TCP服务器进程释放连接。
TCP服务器进程发送TCP连接释放报文段,并进入最后确认状态。该报文段首部FIN和ACK都被设置为1,表明这是一个TCP连接释放报文段,同时对之前收到的报文段进行确认,seq设置为w,这是因为TCP服务器进程可能又发送了一些数据,确认号ack字段的值为u+1,这是对之前收到的TCP连接释放的重复确认。
TCP客户进程,收到TCP连接释放报文段后,针对该报文段,发送普通的确认报文段,之后进入时间等待状态。该报文段首部的ACK值设置为1 ,表明这是一个普通的ACK确认报文段,序号seq字段的值设置为u+1,这是因为TCP客户进程之前发送的连接释放报文段虽然不携带数据,但要消耗掉一个序号,确认号ack字段的值设置为w+1,对所收到的TCP连接释放报文段的确认,TCP服务进程,收到该报文段后,就进入关闭状态,而客户端进程还要经过2MSL才能进入关闭状态。
MSL:最长报文段寿命。RFC793文档建议为2分钟

客户端在发送确认报文段后为什么不直接进入关闭状态还要等待2MSL后才关闭??

假如,TCP服务器进程在发送完最后一个连接释放报文段后,进入最后确认状态,TCP客户进程在发送完最后一个确认报文段后,进入关闭状态。然而,该确认报文段丢失了,这必然会造成TCP服务器进程对TCP连接释放报文段的超时重传,并仍处于最后确认状态。重传的TCP连接释放报文段到达TCP客户端进程,由于TCP客户端进程处于关闭状态,不会理睬该报文段,这必然会造成TCP服务器进程的反复超时重传TCP连接释放报文段,并一直无法进入关闭状态。因此时间等待状态以及处于2MSL的时长,可以确保TCP服务进程收到最后一个TCP确认报文段,进入关闭状态。另外,TCP客户端进程,在发送完最后一个TCP确认报文段后,再经过2MSL时长,就可以使本次连接持续时间内,所产生的所有报文段都从网络中消失,这样就可以使下一个TCP连接中,不会出现旧的报文段。

在这里插入图片描述

保活计时器

在这里插入图片描述

在浏览器中输入 url 地址到显示主页的过程

1.DNS解析
2.TCP连接
3.发送HTTP请求
4.服务器处理请求并返回HTTP报文
5.浏览器解析渲染页面
6.连接结束
1.DNS域名解析,将网址转换成IP地址
过程:首先在本地域名服务器中查询IP地址,如果没有找到的情况下,本地域名服务器会向根域名服务器发送一个请求,如果根域名服务器也不存在该域名时,本地域名会向com顶级域名服务器发送一个请求,依次类推下去。直到最后本地域名服务器得到IP地址并把它缓存到本地,供下次查询使用。
网址真正的解析过程为: . -> .com -> google.com. -> www.google.com.
2.TCP连接
三次握手
3.发送HTTP请求
HTTP请求报文是由三部分组成: 请求行, 请求报头和请求正文。
4.服务器处理请求并返回HTTP报文
HTTP响应报文也是由三部分组成: 状态码, 响应报头和响应报文。
遇到比较常见的状态码有:
200(成功), 404(所请求的页面不存在,无法访问), 500(服务器遇到错误,无法完成请求)
5.浏览器解析渲染页面
6.连接结束
四次挥手

HTTP协议方法

HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD 方法。
HTTP1.1 新增了六种请求方法: GET, POST , HEAD, OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
在这里插入图片描述

Get和Post的区别

(1)post更安全(不会作为url的一部分,不会被缓存、保存在服务器日志、以及浏览器浏览记录中)

(2)post发送的数据更大(get有url长度限制)

(3)post能发送更多的数据类型(get只能发送ASCII字符)

(4)post比get慢

(5)post用于修改和写入数据,get一般用于搜索排序和筛选之类的操作(淘宝,支付宝的搜索查询都是get提交),目的是资源的获取,读取数据

TCP首部报文段格式

在这里插入图片描述
TCP报文段主要有TCP首部和TCP数据组成
TCP首部:
源端口号:2字节

目的端口号:2字节

序号seq4字节 用来指出本TCP报文段数据载荷的第一个字节序号

确认号:ack 4字节 用来指出期望收到对方下一个TCO报文段数据载荷的第一个字节的序号,同时,也是对之前收到的所有数据的确认。

确认标志位ACK:只有当ACK为1时,确认号有效,否则无效。TCP规定,在TCP连接建立后,所有T传送的TCP报文段都要把ACK置为1。

数据偏移:占4bit 用来指出TCP数据载荷部分的起始处距离TCP报文段的起始处有多远。首部长度也叫数据偏移。

保留
占6bits,为今后使用,现在一般置0。

窗口
16bit 字节为单位,指发送本报文字段的接收窗口

校验和
检查范围包括TCP报文段和数据载荷两部分。

SYN:在TCP连接建立时,用来同步序号
FIN: 用来释放TCP连接
RST(复位标识位):用来复位TCP连接。当RST=1时,表明TCP连接出现异常,必须释放连接再重新建立连接。还可以拒接一个非法报文段
PSH(推送标识位):TCP收到一个PSH=1的报文段,会尽快上交应用进程,不需要等待缓存都填满后再上交。
URG和紧急指针:用来实现紧急操作
在这里插入图片描述
在这里插入图片描述

;