网络编程前置知识

网络编程前置知识

概述

网络模型

image-20240510211745283

OSI参考模型
//物理层:任务是透明的传输二进制比特流. 物理层主要用来定义数据终端设备和数据通信设备之间物理链接的方法, eg:网络设备接口的机械形状(例如网线接口)、交换电路的数量和排列、信号的电器特征(例如光信号/电信号)、等....
// 数据链路层: 任务是将网络层的数据组装程帧,进行差错、流量控制,传输管理等。
// 网络层:负责数据的路径选择和逻辑地址寻址,以确保数据能够在不同的网络节点之间正确传输。它还负责数据包的路由和转发。
// 传输层:负责建立和维护端到端的连接,并提供可靠的数据传输服务,如数据的顺序控制、差错控制等。它还提供了拥塞控制和流量控制机制。
// 会话层:会话层负责建立、管理和终止会话,控制数据交换的方式和步骤,以及同步和对话控制等。
// 表示层:表示层负责对数据进行编码和解码,以确保发送方和接收方之间的数据格式一致。它还负责对数据进行加密和解密、压缩和解压缩等转换操作。
// 应用层:应用层负责处理特定的应用程序数据,如电子邮件、Web浏览器等应用程序的数据处理和传输。
TCP/IP参考模型
// 应用层:为用户提供访问Internet的接口,提供了应用协议。
// 传输层:提供端到端的数据传输服务,主要功能有格式化信息流、提供可靠传输以及解决不同应用进程的识别问题。
// 网络层:负责相邻计算机之间的通信,主要功能有处理输入数据报、寻径、流量控制、拥塞控制等。
// 网络接口层:这一层的功能是将数据从主机发送到网络上,相当于OSI模型中的物理层和数据链路层。

数据单元转换

image-20240510211942123

网络实体和模型对照

image-20240510212001394

常见的协议

image-20240510212007192

协议名协议功能占用端口 号
HTTP 超文本传输协议应用层传输Web网站网页和其他资源80
FTP文件传输协议应用层文件上传和下载20/21
Telnet 远程连接协议应用层远程登录(无加密)23
SSH安全外壳协议应用层远程登陆(加密)22
SMTP 简单邮件传输协 议应用层电子邮件(邮件在服务器之间提交和传 送)25
POP3 邮局协议版本3应用层电子邮件(邮件最终交付协议)110
TCP传输层可靠的面向连接的传输层协议
UDP传输层不可靠的基于数据报的传输层协议
IP网络层网际互联协议
ICMP网络层网络控制消息协议
IGMP网络层网络组管理协议
ARP数据链路层地址转换协议
RARP数据链路层反向地址转换协议

网络

应用层的HTTP协议、传输层TCP/UDP协议、网络层IP协议、数据链路层的数据帧组装和ARP协议

应用层的HTTP协议

HTTP的核心功能就是在网络上的客户端和服务器之间传输超文本数据, 而这个传输过程最重要的就是构建HTTP请求和响应报文。(客户端发送给服务器的信息,称之为请求信息;服务器返回给客户端的信息称之为响应信息。一般情况下,我们也将发送的信息称之为报文。即HTTP请求报文和HTTP响应报文)

image-20240510212019020

HTTP请求

发送的HTTP请求一般称之为HTTP请求报文,分为请求行请求头空行请求体/请求正文四部分.其中的一些消息头和正文都是可选的,消息头和正文内容之间要用空行隔开.

GET / HTTP/1.1
Host: www.cskaoyan.com
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: __yjs_duid=1_94c0d6c26a48d04ztHBDp1OrzJxavJbibLH2u7JlFEirZPMlmtowns; 

请求正文/请求体
请求行

请求行的构成: 请求方法 请求资源 请求协议

GET /s?wd=%E6%89%8B%E6%9C%BA HTTP/1.1       //  GET(请求方法)  /s?wd=%E6%89%8B%E6%9C%BA(请求资源)   HTTP/1.1 (请求协议)

请求方法

请求方法,顾名思义就是以何种请求方法向当前的地址发起请求。常见的请求方法有GETPOST两种。GETPOST请求方法主要的区别在于语义上面的不同。
	//1, GET主要用来进行查询数据,POST主要用来进行提交数据。这才是GET和POST本质上的区别
	//2, 至于请求参数的位置不同,不是GET和POST之间的本质区别,仅仅是浏览器的默认行为。对于浏览器来说,浏览器在发送GET请求时,会将请求参数附着在地址栏,也就是请求报文的请求资源后;发送POST请求时,请求参数会位于请求体中,但是这仅仅是浏览器的行为,不是两者之间的本质区别。
	//3, 安全性区别

了解: (除了GET和POST以外的请求方法)

PUT请求: 上传资源/数据
DELETE请求: 删除资源/数据
HEAD请求: 获取相应头信息
OPTIONS请求: 获取请求方式/测试链接

请求资源

// URL: 协议 ,  域名ORIP+端口,  服务器内部路径 ,  参数
https://www.baidu.com/s?rsv_idx=2&hisfilter=1
http://101.43.69.31:8080/#/login?redirect=%2Fdashboard
// 服务器内部路径(并不是真实存在的路径, 只是个标识)+ 参数: 给目标服务器看的 -> 让目标服务根据这个信息, 分析用户想要什么


s?rsv_idx=2&hisfilter=1  这个就是请求资源

// 访问两个不同页面时,主要的区别在于请求资源不同。它是一个给目标服务器的重要标识.

请求协议

// 目前HTTP协议的版本是HTTP/1.1,之前的一个版本是HTTP/1.0。1.0和1.1之间最大的区别在于是否支持长连接。长连接就是在一个TCP连接内发送多个HTTP请求。HTTP/1.1默认支持长连接;HTTP/1.0不支持长连接。所以1.1相较于1.0,网络访问速度会有明显提升。
请求头
Host: www.cskaoyan.com		// 初始URL中的主机和端口,用来指明要访问目标服务器上的哪一个虚拟主机
Connection: keep-alive		// 表示是否需要持久连接。如果服务器看到这里的值为“Keep -Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接 
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36  // 发出请求的浏览器类型(有些是冒充的)
Accept: text/html,application/xhtml+xml,application/xml;   //浏览器可接受的`MIME类型`写法为` (大类型)/(小类型)`。 MIME就是使用一种大类型/小类型的方式将互联网上面的资源进行分类
Accept-Encoding: gzip, deflate		// 浏览器能够进行解码的数据编码方式,比如gzip
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8  // 浏览器所希望的语言种类
Cookie: __yjs_duid=1_94c0d6c26a48d04ztHBDp1OrzJxavJbibLH2u7JlFEirZPMlmtowns;  //  用来验证请求者信息的
  • Accept: 浏览器可接受的MIME类型写法为 (大类型)/(小类型)。 MIME就是使用一种大类型/小类型的方式将互联网上面的资源进行分类。比如text/html,text/txt,image/jpeg,image/png,video/mp4,video/mp3等。因为客户端和服务器在相互通讯时,需要知晓对方传递的资源类型。
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
  • Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集。
// UTF-8
  • Accept-Encoding: 浏览器能够进行解码的数据编码方式,比如gzip。请求头是给服务器看的,意思是指如果服务器返回响应时需要对数据进行压缩,设置编码方式,那么应当使用客户端可以支持的编码方式。
// Accept-Encoding: gzip, deflate, br, zstd
  • Accept-Language: 浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到,可以在浏览器中进行设置; eg: https://www.google.com/search?q=123
// Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
  • Referer: 包含一个URL,用户从该URL代表的页面出发访问当前请求的页面 (防盗链); 比如用户直接访问B页面,以及通过访问A页面,进而跳转至B页面,这两种方式都进入到B页面,那么两种方式在HTTP请求报文中有没有区别呢?(eg: http://www.cskaoyan.com/forum-280-1.html )
// 从A网页发起一个http请求,   referer携带的就是A网页的URL 
  • Content-Type: 一般就是MIME类型,因为服务器和客户端在相互传递数据时,需要让对方知晓资源的类型,是文本文件或者是二进制文件等。(用到不多)
// 告诉服务器, 等一会服务器返回给客户端的http报文的, 正文里, 携带的数据格式类型
// 告诉服务器, 我的这个http报文的正文里, 携带了什么信息

// 现在一般用的话, 一般传json数据, 可能用到
  • Content-Length: 表示请求消息正文的长度。也就是请求体的长度
// 准备在正文携带一些信息给服务器
// Content-Length: 可以描述正文里有多少个字节
  • User-Agent: 浏览器类型
  • Date: Mon, 22 Aug 2023 01:55:39 GMT请求时间GMT
  • Connection: 表示是否需要持久连接。如果服务器看到这里的值为“Keep -Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接
http1.0 http1.1: 长连接
// 发完http请求, 要不要进行4四次挥手: Keep -Alive, 先不要挥手
//                                close , 要四次挥手
  • If-Modified-Since: Wed, 02 Feb 2011 12:04:56 GMT 服务器利用这个头与服务器的文件进行比对,如果一致,则告诉浏览器从缓存中直接读取文件
// 时间一致: 说明自从用户拿到这个文件, 服务器没有对这个文件继续做修改, 所以服务器再给用户一个重复的文件, 既无意义, 又增加带宽, 所以让用户读自己的缓存(肯定有这个缓存)
  • Cookie: 这是最重要的请求头信息之一
// 保存登陆信息: 是一种更安全的方式
  • Host: 初始URL中的主机和端口。

​ Host: www.cskaoyan.com ( 这句话, 代表找一个叫Host的主机 , 在这 主机 != 服务器/电脑)

// Host: 用来指明要访问目标服务器上的哪一个虚拟主机
空行

仅做标识使用

请求正文/请求体(post请求方法会经常用到)

请求体中一般用来传输客户端需要传递给服务器的数据信息等。该部分可以大量的存放数据,比如当客户端需要提交一个文件到服务器时, 比如用户需要传输给服务器一些安全保密的信息,那么就可以将文件的数据放置在请求体中

HTTP响应

HTTP/1.1 200 OK
Date: Mon, 06 Mar 2023 13:21:40 GMT
Content-Type: text/html; charset=gbk
Content-Length: 7111
Connection: keep-alive
Set-Cookie: cZBD_2132_lastact=1678108900%09forum.php%09; 
Vary: Accept-Encoding
Content-Encoding: gzip
YJS-ID: c39171ed0b3336b2-140
Server: yunjiasu

?      韂鸖W桛9蠶?;??癞_k3;揑エVw#5H轁?B鍙q让?3?丶尡?c懒@釺jf抣矙<v2轞Jj瞎凞??u奉=鬓餅筝s谓倴?ut縫笅I?s睇鱱0>0鴽HG0刭萆?6b?N?CRd.v?緮aū`0
响应行
//协议    状态码   原因短语
HTTP/1.1  200     OK

版本协议: HTTP/1.1

状态码: 比较常见的: 200 400段 500段

// 100: 临时响应(基本相当于废弃状态)
// 200: 状态正常(请求响应成功)
// 300: 重定向(http://bing.com/)
// 404: 未找到(资源不存在)
// 500: 服务器内部错误
响应头
  • Location: http://www.cskaoyan.com/指示新的资源的位置。要搭配着重定向状态码一起使用。指引浏览器往改地址再次发起请求。
// 和300段状态码: 重定向配合使用, 服务器告诉客户端, 我没有某个资源, 但是我知道你要的资源在哪. 返回300段, 以及指明Location新地址
  • Server: apache tomcat 指示服务器的类型
// 服务器类型
  • Content-Encoding: gzip 服务器发送的数据采用的编码类型
// 资源的压缩格式
  • Content-Length: 80 告诉浏览器正文的长度。响应体的长度。

  • Content-Language: zh-cn服务发送的文本的语言

  • Content-Type: text/html; 服务器发送的内容的MIME类型

  • Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT文件的最后修改时间

// 假设返回的文件, 指示最后的修改时间
  • Refresh: 1;url=http://www.cskaoyan.com指示客户端刷新频率。单位是秒
// 服务器返回给客户端一个刷新的行为, 要求客户端按照指定时间, 向指定位置发起请求
  • Content-Disposition: attachment; filename=aaa.zip指示客户端保存文件
// 出现在下载文件的行为中
  • Set-Cookie: SS=Q0=5Lb_nQ; path=/search服务器端发送的Cookie
// 服务器产生一个cookie, 用来标识用户信息,  返回用户, 要求用户下次访问这个域名位置, 携带该cookie
  • Cache-Control: no-cache (1.1)
// 服务器要求客户端保存缓存( 图片/文件 )
  • Connection: close/Keep-Alive
  • Date: Tue, 11 Jul 2000 18:23:51 GMT
空行

标识使用

响应正文/响应体

也叫作响应正文。可以是文本数据也可以是二进制类型数据。其中响应头中Content-Type指示了该资源的类型,比如文本类型资源时,Content-Type:text/html;图片资源时Content-Type:image/png;Content-Length指示了响应体的长度。

HTTPS:拓展

HTTP协议具有非常优秀的一面,但是也有很多不足之处,具体体现如下:

//通讯使用明文(未加密),内容可能会被窃听
//不验证通讯方的身份,可能遭遇伪装
//无法验证报文的完整性,内容可能被篡改

HTTPS分别引入了加密算法、证书、完整性保障来解决对应的问题

抓包: 重要/非常重要

抓包追踪一个http请求, 获取一些关键的信息

如果给我们一个http请求, 我们要重点追踪那些信息?
// 1, 这个请求有没有成功: -> 状态码 -> 200
// 2, 请求方式是不是想要的方式
// 2, IP地址对不对? -> 是不是你期望的地址
// 3, 端口对不对? -> 端口是不是你预期的要发请求的端口
// 4, 服务器内部路径对不对? ->  是不是你预期的要发请求的路径
// 5, 携带参数对不对? -> 是否符合你的预期 
// 6, 返回的参数对不对

抓包: 就是通过分析用户发起的所有请求, 获得一些关键信息

使用Chrome浏览器OR抓包工具进行抓包非常重要.

一些题目

HTTP的中文全称是什么?从全称的每个字段来说明HTTP的特点。

HTTP 的中文全称是“超文本传输协议”。
    超文本(Hypertext):特点:HTTP 最初设计用于传输超文本信息,即可以包含文本、图片、链接等多媒体元素的文本。这使得 HTTP 在互联网上广泛应用,支持网页的浏览和链接。
    传输(Transfer):特点:HTTP 是一种应用层协议,主要用于在客户端和服务器之间传输数据。它建立在可靠的传输协议(如 TCP)之上,保证了数据的可靠传输。
    协议(Protocol):特点:HTTP 是一种约定、协商双方通信规则的协议。它规定了客户端和服务器之间如何通信、数据如何组织和传输等规范,使得不同系统之间能够实现信息的互通。

URI由哪些部分组成?

假设我们有以下 URI:https://www.example.com:8080/path/to/resource?name=John&age=30#section2

协议方案部分(Scheme):https
	说明:这部分指定了访问资源所需的协议,这里使用的是 HTTPS,意味着在传输过程中使用了安全的加密协议。
    
身份信息部分(Authority):www.example.com:8080
	说明:身份信息部分通常包括服务器的主机名或 IP 地址以及端口号。在这个例子中,服务器主机名是 www.example.com,使用的端口号是 8080。
    
路径部分(Path):/path/to/resource
	说明:路径部分指定了服务器上资源的位置。在这里,资源的路径是 /path/to/resource,表示在服务器文件系统中的特定位置。
    
查询字符串部分(Query):?name=John&age=30
	说明:查询字符串部分用于向服务器传递参数。在这个例子中,包含了两个参数:name=John 和 age=30,用 & 分隔每个参数。
    
片段标识符部分(Fragment):#section2
	说明:片段标识符部分用于定位资源中的特定片段或位置。在这里,section2 可能是页面中的某个锚点或特定部分,允许直接导航到此位置。

HTTP请求报文和响应报文由哪些部分组成?HTTP常用方法有哪些?HTTP常用状态码有哪些?

HTTP请求报文通常由以下几部分组成:
	请求行:包含请求方法、URI和协议版本,如 GET /index.html HTTP/1.1。
	请求头部:包含关于请求的附加信息,如 Host、User-Agent、Content-Type等。
	空行:用于分隔请求头部和请求体。
	请求体:包含实际发送给服务器的数据,例如POST请求中的表单数据。
    
HTTP响应报文通常由以下几部分组成:
	状态行:包含协议版本、状态码和状态消息,如 HTTP/1.1 200 OK。
	响应头部:包含关于响应的附加信息,如 Content-Type、Content-Length等。
	空行:用于分隔响应头部和响应体。
	响应体:包含服务器返回给客户端的实际数据,如网页内容、图片等。
    
HTTP常用方法:
	GET:请求指定的资源。
	POST:向指定资源提交数据进行处理请求。
	PUT:上传指定资源。
	DELETE:删除指定资源。
	HEAD:类似于 GET 请求,但只返回响应头,不返回实际内容。
	PATCH:对资源进行部分修改。
    
HTTP常用状态码:
	100: 临时响应(基本相当于废弃状态)
    200: 状态正常(请求响应成功)
    300: 重定向(http://bing.com/)
    404: 未找到(资源不存在)
    500: 服务器内部错误

对称加密和非对称加密有什么区别?简要说明一下HTTPS的握手阶段流程。

对称加密:
    密钥:对称加密使用相同的密钥来加密和解密数据。
    速度:加密和解密速度快,适合于大数据量的加密。
    密钥管理:需要确保密钥的安全性,因为发送方和接收方必须共享同一密钥。
    应用:常用于数据传输和加密存储,例如AES(高级加密标准)算法。
    
非对称加密:
    密钥:非对称加密使用一对密钥,公钥和私钥,公钥用于加密,私钥用于解密。
    安全性:公钥可以公开分享,私钥必须保密,提供更高的安全性。
    复杂性:加密和解密速度较慢,适合小数据量的加密,例如数字签名和安全通信。
    应用:常用于数字签名、身份验证、安全通信等,例如RSA(RSA算法)和ECC(椭圆曲线密码算法)。
    
流程:
    用户向服务器发起请求: 为了获取服务器的证书和公钥
    服务器返回给用户证书和公钥
    用户验证证书是否合法
    用户使用服务器的公钥把自己的加密的机制加密, 发给服务器
    服务器拿到用户的经过公钥的加密方式, 使用私钥解密
    用户和服务器都获得了用户的加密方式
    以用户的加密方式加密信息, 进行通信

HTTP协议中GET请求和POST请求的区别有哪些呢?

参数位置:
    GET请求:参数会附加在URL后面,以?分隔URL和参数,参数之间用&连接,例如:http://example.com/path?name=John&age=30
    POST请求:参数会作为请求的一部分发送给服务器,而不是直接暴露在URL中。
    
安全性:
    GET请求:参数在URL中可见,不适合传输敏感数据,如密码等。
    POST请求:参数不直接暴露在URL中,更适合用于传输敏感数据,因为参数在请求体中,不会被直接暴露。
    
数据长度限制:
    GET请求:受浏览器和服务器对URL长度的限制,传输的数据量有限。
    POST请求:可以传输更多数据量,因为请求体中可以传输较大的数据。
    
缓存:
    GET请求:请求可被缓存,适合获取不经常改变的数据。
    POST请求:请求不会被缓存,适合传输需要动态修改或更新的数据。

幂等性:
    GET请求:幂等操作,对同一URL的多次请求应该返回相同的结果。
    POST请求:非幂等操作,多次提交相同的POST请求可能导致资源状态发生改变。

传输层的TCP协议

TCP是一种面向连接的协议,提供可靠的有序的错误校验的数据传输方式,但传输效率相对较低

传输控制协议(TCP)是整个四层模型当中最重要的协议,它工作在传输层,其目标是在不可靠的逐跳传输的网络层之上,构建一个可靠的 、面向连接的 、全双工的端到端协议。

为什么说是TCP是端到端的: 因为对于传输层协议而言, 通信的双方是两台主机之间的通信, 是两台主机的逻辑上的直达信息(这是其逻辑上和网络层路由传递以及数据链路层的帧转发不同的点)。

image-20240511153119381

tcp头部

image-20240511154912095

各个字段意义

源端口
//记录发送请求的主机的发送端口
目的端口
//记录目标主机接收请求端口
序号Seq
//在一个完整的TCP请求中, TCP给整个传输过程中的数据流中每一个字节从小到大开始编号(起始编号来自于三次握手建立连接时第一次握手时随机生成的Seq编号,后续的握手请求,以及握手完成之后的数据传输请求, 都是以这个编号为起始不断向后排序增加),这个序号Seq指的是本报文段所发送的数据的第一个字节的编号。
//比如某一报文段的序号Seq值是301,它携带的数据共有100个字节,则表明报文段的数据的第一个字节序号编号为301,最后一个字节的序号为400; 那么下一个报文段的序号Seq值就是401
//占4字节,共有2^32个序号,超出表示范围循环回到0。
确认号Ack
//确认号是我们接收到一个请求之后,并且经过对数据检测给对方表示确认这个数据合法的标识。
//确认号只有在确认位(确认位ACK)为1的时候,才有效,才具有实际意义。(比如第一次握手时ACK为0,确认号无意义)
//并且,确认号是以期望收到对方的下一个报文段数据的第一个字节序号作为标识的。
//比如主机A向主机B发送了一个报文段,此次报文段序号Seq为185,携带数据50字节。主机B收到这个报文段并检测合法无误之后,应该要给A回复一个确认报文(未必一定会回复,存在累积确认问题),在这个B回复给A的确认报文中,确认位ACK为1, 确认号Ack位235(=185+50), 表示B已经收到了字节编号为185~234的正确数据, 期望收到A的标号为235的数据。(因为A已经给B发送了序号从185~234的数据了,下一次A如果要再给B发数据, 数据编号就要从235开始了)
数据偏移   
//表示TCP报文段的数据起始处(即:TCP首部后面的应用层数据起始位置)距TCP报文段的起始处有多远,即TCP首部长度。
//由于占4位,可以表示到2^4为16,能够表示的最大十进制数字是15,因此数据偏移的最大值为60字节(=15*4,因为TCP首部是4字节对齐)。
//也就是说TCP报文首部最小为20字节,最大为60字节,也就意味这可选 “选项+填充” = “0~40字节”。
保留位
//保留为今后使用,目前置为0。
紧急位URG
//占用1位, URG=1表示后面的紧急指针有效(它告诉系统报文段有紧急数据,告诉目标主机应当尽快处理)(当接收端的TCP层检测到一个设置了URG位的报文段,它会立即将这部分数据传递给上层的应用程序,而不是按照正常的队列顺序排队。这使得应用程序能够快速响应紧急情况),URG=0表示后面的紧急指针无效。
确认位ACK
//占用1位, ACK=1表示前面确认位有效,ACK=0表示前面确认位无效。
推送位PSH
//占用1位, 当一台主机接收到PSH=1的报文段,表示应尽快交付给接收该请求的应用进程,而不是等到整个缓存都存满之后再向上交付。(一般接收端的TCP会等待其缓冲区填满或接近填满时再将数据传递给应用程序OR应用程序主动读OR其它小众策略)
复位位RSH
//占用1位, 当RSH=1表示TCP链接中出现严重差错(eg:主机崩溃),必须释放链接,然后进行重建连接
同步位SYN
//占用1位, 当SYN=1表示这是一个建立连接的请求(eg:SYN=1,ACK=0请求连接第一次握手, SYN=1,ACK=1响应连接请求第二次握手)
终止位FIN
//占用1位, 当FIN=1用来释放一个连接,表明此报文段发送方的数据已经发送完毕,并要求释放运输连接(第1和3次挥手)
窗口大小
//表示发送端的接收窗口所能允许接受到对方发送的数据量的大小,比如说确认号Ack为701,窗口为1000,则表示下一次接收,从701序号开始,发送报文段的一方还有接收1000个字节数据的缓存空间。在接收数据的时候动态变化(即使当接收方缓存为0,发送方也会定期发送小的探测报文段探测缓存大小)。
效验和
//检验的范围包括首部和数据部分(拼接12字节伪首部和效验方式问题,有兴趣可以去了解,不重要)
紧急指针
//紧急指针仅指在URG=1时才有意义,它指出本报文段中紧急数据的字节数。当所有紧急数据都处理完毕,TCP就告诉应用程序恢复到正常操作。值得注意的是,即使窗口为0也可以发送紧急数据。
选项
//长度可变0~40字节
//最常见的选项是最大 段大小(MSS), 用来描述后续希望接收到的报文段的最大值,(这个数值通常受限于(数据帧)MTU,比如MTU为1500,IP数据报头部为20字节, TCP头部为20字节,则MSS是1460)

可靠传输:TCP协议的可靠性和可靠传输是靠序号和确认机制,以及重传机制保证的。

序号机制:
//TCP将整个数据流分成一个个的字节,并为每个字节分配一个序列号。
//连接建立时,TCP随机生成一个初始序列号(ISN)。这个序列号随着握手连接和数据传输逐字节递增。
//每个TCP报文段的序号代表了该报文段中第一个字节的序列号。
确认机制:
//TCP使用累积确认机制。当接收方收到一个报文段后,它会发送一个ACK报文段/确认报文,确认号设置为下一个期望接收的字节的序列号。eg: 如果接收方收到序号为N的报文段,并且该报文段包含100个字节的数据,则它会发送一个确认号为N+100的ACK报文段。
重传机制:
//如果发送方没有在超时时间内收到对某个报文段回传的确认报文段,发送方会假定该报文段已丢失或在网络中延迟,并重新发送该报文段。
//TCP也使用快速重传机制。即当发送方收到目标主机回传的对同一数据包的三个重复确认报文段时,它会立即重新发送该数据包,而不是等待超时。

累积确认

累积确认意味着一个ACK报文段/确认报文, 会确认该确认号序号之前直到该序列号为止的所有字节。

快速重传&窗口机制

窗口大小和流量控制:
//发送端维护了一个发送窗口,接收端维护了一个接收窗口,这有助于数据传输的效率提升(相比较线性的一问一答方式)。
//ACK报文段/确认报文包含一个窗口大小字段,告诉发送方接收方还能接收多少字节的数据。这是流量控制的一部分,确保发送方不会溢出接收方的缓冲区。
//当发送方接收到某部分数据的确认报文, 把这部分数据从发送端口缓存移除
//我们假设发送窗口发送了4个报文,假设每个报文段携带数据有100字节,序号编号分别是100,200,300,400;表示四份报文分别携带的数据编号是100-199,200-299,300-399,400-499
//但是在网络传输中100-199被收到(接收此段数据,目标服务器可能会回复确认,也可能此时不回复确认),200-299在网络中丢失
//紧接着,目标服务器收到了300-399数据, 但是此时目标服务器需要的编号数据是200-299,所以此时目标服务器会直接回传给发送端一个对100-199的确认报文(确认号为200),表示接下来需要编号为200的数据, 而非是对300-399进行确认
//如果,目标服务器又收到了400-499数据,标服务器还是会直接回传给发送端一个对100-199的确认报文(确认号为200),表示接下来需要编号为200的数据, 而非是对400-499进行确认
//而从发送端的角度, 如果发送端连续收到了目标主机回传对某个字节编号的重复确认(冗余ACK, 比如上面例子中的发送端将收到连续确认号200)(三次),那么即使在发送报文未超过设置的超时时间,该报文也会重传。 

建立TCP连接:三次握手

TCP的三次握手流程,如图所示

image-20240511155138663

第一次握手:SYN发送
//发起:客户端向服务器发送一个SYN(同步)报文段,SYN位被设置为1。
//序列号:客户端在报文段中生成一个序列号x。这个序列号也用于后续的数据传输。
//目的:这一步的目的是通知服务器客户端想要建立连接,并且客户端准备好了接收数据。
第二次握手:SYN和ACK的发送
//确认接收:服务器接收到客户端的SYN(同步)报文后。服务器向客户端发送一个确认报文,ACK(确认)位都被设置为1。确认号为发送报文x加上1。
//并且,携带自己的序号Seq=y,和同步字段SYN=1.(为了建立双工通信)
//目的:这一步的目的是服务器同意建立连接,并且准备好接收客户端发送的数据。
第三次握手:ACK的发送
//最终确认:客户端接收到服务器的SYN(同步)-ACK(确认)报文后,发送一个ACK(确认)报文作为响应。这个ACK报文只设置ACK位为1。
//确认号:客户端将确认号设置为服务器的初始序列号加1,确认服务器的SYN。
//数据准备:从这一步开始,客户端和服务器都确认了对方的初始序列号,准备好了进行数据传输。

释放TCP连接:四次挥手

TCP的四次挥手流程,如图所示

image-20240511155017606

第一次挥手:FIN发送
//发起关闭:当客户端完成数据发送后,它需要终止连接。客户端发送一个FIN(终止)报文段给服务器。这个报文段中FIN位被设置为1,表明客户端没有更多的数据发送。
//序列号:这个报文段中的序号Seq为客户端的当前序列号。
第二次挥手:ACK发送
//确认接收:服务器接收到客户端的FIN报文后,发送一个ACK报文段作为响应。设置ACK=1,确认号设置为客户端的序列号加1。
//半关闭状态:此时,客户端到服务器的连接被关闭,但服务器仍然可以向客户端发送数据。这个状态被称为半关闭(half-close)。
第三次挥手:FIN发送
//服务器完成发送:一旦服务器也完成了数据发送,它需要向客户端发送一个FIN报文段,来通知客户端它也没有更多的数据要发送。设置FIN=1
//序列号:这个FIN报文段包含服务器的当前序列号。
第四次挥手:ACK发送
//最终确认:客户端接收到服务器的FIN报文后,发送一个ACK报文作为响应。设置ACK=1,序列号为客户端当前的序列号,确认号设置为服务器的序列号加1。

TCP的状态转换

image-20240511155219979

传输层协议UDP

UDP的特点

UDP是一种保留消息边界的简单的面向数据报的传输层协议。

  1. 无连接:UDP是一种无连接协议。这意味着在数据包发送之前,发送方和接收方之间不需要建立连接。每个数据包之间独立发送,彼此之间没有依赖关系。
  2. 低开销:UDP协议头部较小,只有8字节,相比之下,TCP协议头部最少20字节。UDP的简单性使得它在传输数据时增加的开销更少。
  3. 不可靠传输:UDP不提供数据到达的保证。因为它不进行错误检查或者纠正,意味着网络上的数据包可能会丢失、重复或乱序到达,且发送方不会得到通知。
  4. 无拥塞控制:UDP不实现拥塞控制机制。它以相同的速度发送数据,不论网络条件如何。这可能导致在网络质量较差时数据包被丢弃。
  5. 快速传输:由于缺乏连接建立、确认响应、流量控制等机制,UDP可以更快速地传输数据(能不能到目的地是另外一件事)。

由于其特性,UDP通常用于那些对实时性要求高但对可靠性要求不高的应用,例如视频流、VoIP(语音通信)、在线游戏、早期的聊天软件等。

UDP报文头部

当应用层数据从上面转移到传输层时,下层的数据单元会把上层数据单元的所有内容包含进来,作为下层协议数据单元的有效载荷。

image-20240511155506849

以应用层UDP协议为例,当应用层数据从上面转移到传输层,UDP协议会在应用层数据的基础上拼接一个UDP头部信息,封装成一个UDP报文段。

image-20240511155513014

UDP头部格式

image-20240511155519525

ps: 这个UDP长度 = UDP头部长度+数据长度

  • 22
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值