TCP
TCP特点:TCP是面向连接的、点对点的、可靠的、全双工通信的、面向字节流的协议
TCP报文格式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ntX7QSOg-1682260555887)(C:\Users\Cheng\AppData\Roaming\Typora\typora-user-images\image-20230405182859414.png)]
序号:非复数,可循环使用,在一个TCP连接中传送的字节流中的每个字节都需要按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。首部中的序号字段值则指本报文段所发送的数据的第一个字节的序号。
确认号:是期望收到对方下一个报文段的第一个数据字节的序号。一般用于确认报文中。
数据偏移:指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。也就是TCP首部的长度。
确认ACK:仅当ACK = 1时确认号字段才有效。TCP规定,在建立连接后,所有传送的报文段都必须把ACK置为1。
同步SYN:在连接建立时用来同步序号。当SYN = 1而ACK = 0时,表明这是一个连接请求报文段。若对方同意建立连接,则应在相应的报文段中使SYN = 1和ACK = 1。因此,SYN置为1就表明这是一个连接请求或连接接受报文。
窗口:指的是发送本报文段的一方的接收窗口。窗口值告诉对方:从本报文段首部的确认号算起,接收方目前允许对方发送的数据量(以字节为单位)。它是作为接收方让发送方设置其发送窗口的依据。
选项:其中有一项是MSS,即最大报文长度。MSS是每个TCP报文段中的数据字段的最大长度,可由通信双发在建立连接时确认,双方也可以不一样。默认是536字节长。
TCP连接建立——三次握手
TCP建立连接的过程叫握手,握手需要在客户和服务器之前交换三个TCP报文段。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eMuK1FMz-1682260555888)(C:\Users\Cheng\AppData\Roaming\Typora\typora-user-images\image-20230405223750128.png)]
TCP进程最初都是CLOSED状态。在本例中,A主动打开连接,B被动打开连接。
最开始,A、B的进程首先创建传输控制模块TCB,这时这两个TCB都处于CLOSED状态,然后B通过listen系统调用,使TCB处于LISTEN状态。然后开始三次握手:
- A向B发出连接请求报文,这时首部的SYN=1,同时选择一个初始序号seq=x。TCP规定,SYN报文不能携带数据,但是需要消耗调一个序号。这时A的TCB进入SYN-SENT状态。
- B收到连接请求报文段后,向A发送确认。在这个确认报文段中,SYN=1,ACK=1,确认号是ack=x+1,同时也为自己选择一个初始序号seq=y。这个报文段也不能携带数据,但是也要消耗调一个序列。这时B的TCB进入SYN-RCVD状态。
- A收到B的确认后,还要向B给出确认。确认报文段的ACK置1,确认号是ack=y+1,自己的序号是seq=x+1.TCP规定,ACK报文可以携带数据,但如果不携带数据,则不消耗序号。这时A进入ESTABLISHED状态。当B收到A的确认后,也进入ESTABLISHED状态。
三次握手的意义:
- 确保客户端到服务器端和服务器端到客户端的通路都是联通的;
- 最后一次确认,是为了防止已失效的连接请求报文段突然又传送到了B,因而产生错误。
TCP的连接释放——四次挥手
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NeJTR1B1-1682260555888)(C:\Users\Cheng\AppData\Roaming\Typora\typora-user-images\image-20230406080744265.png)]
假设A进程主动发起关闭连接。此时A和B的TCB都处于ESTABLISHED状态
- A进程先向自己的TCB发出连接释放报文段,并停止再发送数据,主动关闭TCP连接。A把连接释放报文段首部的终止控制为FIN置1,其序号seq=u,它等于前面已传送过的数据的最后一个字节的序号加1.这时A进入FIN-WAIT-1状态,等待B的确认。TCP规定,FIN报文段即使不携带数据,它也消耗掉一个序号。
- B收到连接释放报文段后立即发出确认,确认号是ack=u+1,而这个报文段自己的序号是v,等于B前面已传送过的数据的最后一个字节序号加1.然后B进入了ClOSE-WAIT状态。这时TCP连接处于半关闭状态,即A没有数据要发送了,但B若发送数据,A仍要接收。A收到来自B的确认后,就进入FIN-WAIT2状态,等待B发出了连接释放报文段。
- 若B已经没有要向A发送的数据了,其应用进程就通知TCB释放连接,向A发送释放报文段,即FIN=1。假定B现在的序号是w,B还必须重复上次已发送过的确认号ack=u+1。这时B进入LAST-ACK状态。
- A在收到B的连接释放报文段后,向B发送确认报文段,把ACK置1,确认号ack=w+1,自己的序号是seq=u+1(根据TCP标准,前面发送的FIN报文段要消耗一个序号)。然后A进入到TIME-WAIT状态。现在TCP连接还没有释放掉,必须经过时间等待计时器设置的时间2MSL后,A才进入到CLOSED状态。MSL是最长报文段寿命。B只要收到A发出的确认,就进入了CLOSED状态。
设置时间等待计时器的目的是:
- 保证A发送的最后一个ACK报文段能够到达B;
- 防止已失效的连接请求报文段出现在本次连接中。
TCP保活计时器:防止在已经建立好连接的情况下,客户机故障不会导致服务器白白等待下去。
工作原理:服务器每次收到一次客户的数据,就重新设置保活计时器,时间通常是2个小时。若两个小时内没有收到客户的数据,服务器就发送一个探测报文段,以后每隔75秒发送一次。若连发10个探测报文段后仍无客户的相应,服务器就认为客户端出了故障,接着就关闭这个连接。
TCP的有限状态机
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mdsRYOCX-1682260555888)(C:\Users\Cheng\AppData\Roaming\Typora\typora-user-images\image-20230406083057593.png)]
TCP可靠传输的实现
滑动窗口
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H1jnxfBt-1682260555888)(C:\Users\Cheng\AppData\Roaming\Typora\typora-user-images\image-20230405211243839.png)]
滑动窗口特点:
-
滑动窗口以字节为单位,发送的过程中,发送滑动窗口只能前移,不能后移。
-
发送方的发送窗口,一定不能大于接收方的接收窗口
-
接收方只能对按序收到的数据中的最高序号给出确认
-
当接收方给出了某个序号的确认后,发送滑动窗口的后沿就可以移动到这个序号处,前沿也可以根据接收窗口大小等因素,前移相应的位置。
-
TCP发送方在规定事件内没有收到确认,就要重传已发送的报文段。
滑动窗口和缓存的关系:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s5Yy1bF1-1682260555889)(C:\Users\Cheng\AppData\Roaming\Typora\typora-user-images\image-20230405212157217.png)]
发送缓存暂时存放:
- 发送应用程序传送给发送方TCP准备发送的数据;
- TCP已发送出但尚未收到确认的数据。
接收缓存用来暂时存放:
- 按序到达的、但尚未被应用程序读取的数据;
- 未按序到达的数据。
超时重传时间的选择:
RTO(超时重传时间);
大多数的实现还是重传所有未被确认的数据块。
TCP的流量控制
控制的方法是,接收方在回复给发送方的确认报文中通过窗口的大小控制。
当接收方不允许发送方发送数据时,会给发送方发送一个零窗口报文段,等到接收方有一些存储空间后,再给发送方发送一个窗口大小为正数的报文。但是接收方有可能没有接受到非零报文,导致一直死锁。为了解决这个问题:
- TCP为每个连接设置了一个持续计时器,只要一方收到了对方的零窗口通知,就启动计时器。若持续计时器设置的时间到了,就发送一个零窗口探测报文,而对方在确认这个探测报文段时给出现在的窗口值来打破僵局。
TCP的拥塞控制
TCP的拥塞控制
UDP
UDP是无连接的、尽最大努力交付的、面向报文的、没有拥塞控制的、可以多对多的协议
UDP报文格式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kYcQ96UM-1682260555889)(C:\Users\Cheng\AppData\Roaming\Typora\typora-user-images\image-20230408142444131.png)]
UDP长度:UDP用户数据报的长度,其最小值是8
伪首部:它不参与数据的发送,只是被用来计算检验和。
端口:
服务器使用的端口由两类组成:系统端口号或熟知端口号和登记端口号。前者的数值为01023,被分配给了TCP/IP中最重要的一些应用程序。后者为102449151,这类端口号,必须在IANA登记后,才能使用。
客户端使用的端口号:又叫短暂端口号,这类端口号留给客户进程选择暂时使用。
DNS
域名系统DNS被用来将域名映射为IP地址。
域名
域名示例:mail.cctv.com
比如这个域名,是中央电视台用于收发电子邮件的计算机域名,由三个标号组成,其中com是顶级域名,cctv是二级域名,mail是三级域名。.是用来区分标号的,每个域名由多少个标号组成没有统一的规定。从右到左,标号的等级逐渐下降。
域名服务器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AUugjeOJ-1682260555889)(C:\Users\Cheng\AppData\Roaming\Typora\typora-user-images\image-20230408152450846.png)]
根域名服务器:只有13个使用不同IP地址的域名,域名分别是a.rootservers.net,b.rootservers.net等待。跟域名服务器可以告诉查询者接下来应该查询哪个顶级域名服务器。
顶级域名服务器:告诉被查询者接下来查询哪个权限域名服务器或者直接告诉IP地址
权限域名服务器:告诉被查询者目的地址或者下一步要查找的其他权限域名服务器的IP
本地域名服务器:不属于互联网的域名服务器层次结构。当一台主机发出DNS查询请求时,这个查询请求报文就发送给本地域名服务器。
域名解析过程
迭代查询:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MoJNOjTF-1682260555889)(C:\Users\Cheng\AppData\Roaming\Typora\typora-user-images\image-20230408153657884.png)]
递归查询:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9GzVw3mW-1682260555889)(C:\Users\Cheng\AppData\Roaming\Typora\typora-user-images\image-20230408155108219.png)]
主机向本地域名服务器的查询一般采用递归查询。本地域名服务器向根域名服务器的查询一般是迭代查询。至于使用哪种查询方式,取决于最初的查询请求报文的设置。
HTTP
超文本传输协议(HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议,是万维网的数据通信的基础。
HTTP使用了TCP作为运输层的协议,但其本身是无连接的、无状态的。
HTTP1.0传输过程:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cEGB1ydA-1682260555889)(C:\Users\Cheng\AppData\Roaming\Typora\typora-user-images\image-20230408161630561.png)]
HTTP协议首先要和服务器建立TCP连接。当建立TCP连接的三次报文握手的前两部分完成后,万维网客户就把HTTP请求报文,作为建立TCP连接的第三次报文握手中的第三个报文的数据,发送给万维网服务器。服务器收到HTTP请求报文后,就把所请求的文档作为相应报文返回给客户。
可以看出,每次传输一个文件,就会有两倍的RTT开销,HTTP1.1协议很好的解决了这个问题,它使用了持续连接。
所谓持续连接就是在万维网服务器发送给相应后,仍然在一段时间内保持这条连接,使同一个客户和该服务器可以继续在这条连接上传后续的HTTP请求报文和相应报文。
HTTP1.1有两种工作方式,分别是非流水线方式和流水线方式。非流水线方式,是客户在收到前一个相应后,才能发出下一个请求;流水线方式,是客户在收到http的相应报文前,就能接着发送新的请求报文。
HTTP报文结构:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MsJxr0kx-1682260555889)(C:\Users\Cheng\AppData\Roaming\Typora\typora-user-images\image-20230408165505416.png)]
由于HTTP是面向文本的,因此在报文中的每个字段都是一些ASCII码串,各个字段的长度都是不确定的。
开始行:用于区分是请求报文,还是相应报文。
首部行:用来说明浏览器、服务器或报文主体的一些信息。首部可以有好几行,也可以不使用。每行首部都有首部字段名和它的值,每行结束的地方都有回车和换行。整个首部结束时,还有一行空格将首部行和后面的实体主体分开。
实体主体,在请求报文中一般都不用这个字段,而在相应报文中也可能没有这个字段。
HTTP请求报文特点:
请求报文的第一行只有三个内容:方法,URL,HTTP版本。
“方法”就是对所请求的对象进行的操作,也就是一些命令。常用的方法如下:
- GET:请求读取由URL所标志的信息
- POST:给服务器添加信息
- HEAD:请求读取由URL所标志的信息的首部
- PUT:在指明的URL下存储一个文档
- DELETE:删除指明的URL所标志的资源
- CONNECT:用于代理服务器
响应报文特点:
第一行是状态行,包括三项内容:HTTP版本,状态码,解释状态码的简单短语。
状态码分为5大类,其详细含义在短语中有解释。