1.TCP协议
1.
TCP(Transmission Control Protocol):传输控制协议
2.TCP协议是一种面向连接的、可靠的、 基于字节流的传输层通信协议1.
面向连接:两个使用TCP协议的应用(通常一个客户和一个服务器)在彼此交换数据包之前必须先建立一个TCP连接
2.可靠的1.数据传输之前都要建立连接(
三次握手),数据传输结束后都要释放连接(四次挥手)
2.数据被分割成TCP认为适合发送的数据块,而采用UDP协议的数据长度将保持不变
3.由TCP传递给IP的信息单位称为报文段或段segment
4.当TCP发出一个段后将启动一个定时器,等待目的端确认收到这个报文段,如果不能及时收到一个确认,将重发这个报文段
5.等待协议:客户发送一次数据到服务端,必须等到服务端响应后才发第二次数据,中间的等待时间占了大部分时间,中间如果出现差错(超时或确认丢失)都需要重新传输
5.TCP将保存首部和数据的检验和,这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化,如果收到段的检验和有差错,TCP将丢弃这个报文段并不确认收到此报文段,发送端需要重新发送3.
TCP位码即TCP标志位共有六种1.
SYN(建立)
2.ACK(确认)
3.PSH(传送)
4.FIN(结束)
5.RST(重置)、
6.URG(紧急)
7.Sequence number(顺序号码)
8.Acknowledge number(确认号码)
1.三次握手
1.
TCP协议中建立连接需要经过三次握手,开始时客户端处于CLOSED的状态,服务端处于LISTEN状态1.
第一次握手1.客户端发送
SYN报文(包)到服务器并指明客户端的初始化序列号seq,此时客户端处于SYN_SEND状态,等待服务器确认
2.首部的同步位SYN=1,初始化序列号sqe=x,x是一个随机生成的值2.
第二次握手1.服务器收到客户端的
SYN报文,发送一个SYN+ACK报文作为应答并且指定自己的初始化序列号
2.将客户端的初始化序列号加一,即x + 1作为ack的值,表示已经收到了客户端的SYN报文,此时服务器处于SYN_REVD的状态
3.确认报文段中SYN=1,ACK=1,确认号ack=x+1,初始化序列号seq=y3.
第三次握手1.客户端收到服务器
SYN+ACK报文后,会向服务器发送一个ACK报文表示已经收到了服务端的报文
2.此时客户端处于ESTABLISHED状态,服务器收到ACK报文之后,也处于ESTABLISHED状态,此时双方已建立起了连接,完成三次握手
3.确认报文段中ACK=1,确认号ack=y+1,初始化序列号seq=x+12.三次握手(
Three-way Handshake)本质:指建立一个TCP连接时需要客户端和服务器总共发送3个包
3.三次握手的作用:确认双方的接收能力和发送能力是否正常,指定自己的初始化序列号为后面的可靠性传送做准备,实质上是连接服务器指定端口建立TCP连接并同步连接双方的序列号和确认号,交换TCP窗口大小信息
4.理想状态下TCP连接一旦建立,则在通信双方中的任何一方主动关闭连接之前TCP连接都将被一直保持下去
5.一般握手过程中传送的包里不包含数据,三次握手完成后客户端与服务器才正式开始传送数据
6.注意1.
SYN=1报文段不能携带数据,ACK报文段可以携带数据,不携带数据则不消耗序号,即三次握手的前两次不能携带数据,而第三次可以携带数据
2.ACK和ack的区别1.三次握手发送的数据包中有两个
ACK,习惯通过一个大写一个小写加以区分
2.ACK:确认标志(Acknowledgement),值为1表示确认连接
3.ack:确认编号(Acknowledgement Number),值为发送方传来的seq+1,表示已经成功接收上一次所有数据3.需要三次握手的原因
1.第一次握手:客户端发送网络包,服务端接收;结论:
服务端可知客户端的发送能力正常
2.第二次握手:服务端发送网络包,客户端接收;结论:客户端可知服务端的接收,发送能力正常,但是此时服务端并不能确认客户端的接收能力正常所以需要第三次的确认
3.第三次握手:客户端发送网络包,服务端接收;结论:服务端可知客户端的接收,发送能力正常4.两次握手的问题
1.客户端发出连接请求但因连接请求报文丢失而未收到确认,于是客户端再重传一次连接请求
2.服务端后来收到了确认,建立了连接,数据传输完毕后,就释放了连接
3.客户端共发出了两个连接请求报文段,其中第一个丢失,第二个到达了服务端,但是第一个丢失的报文段只是在某些网络结点长时间滞留,从而延误到连接释放以后的某个时间才到达服务端
4.此时服务端误认为客户端又发出一次新的连接请求,于是就向客户端发出确认报文段,同意建立连接
5.不采用三次握手,只要服务端发出确认就建立新的连接,此时客户端忽略服务端发来的确认也不发送数据,则服务端一致等待客户端发送数据,浪费资源5.半连接队列和全连接队列
1.服务器第一次接收到客户端的
SYN报文后会处于SYN_RCVD状态,此时双方还没有完全建立其连接,服务器会把此种状态下请求连接放在一个队列里,把这种队列称之为半连接队列
2.全连接队列:已经完成三次握手建立起连接的会放在全连接队列中,如果队列满了有可能会出现丢包现象
3.服务器发送完SYN+ACK包后如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除,且每次重传等待的时间不一定相同,一般会是指数增长
1.初始化序列号ISN
1.客户端和服务端在建立
TCP连接时,双方都会发送SYN报文并初始化序列号(Initial Sequence Number,ISN)
2.使用相同ISN导致的问题1.假设
A和B使用固定的序号,A使用序号1和B建立TCP连接,发送一个SYN报文,此时seq = 1,经过三次握手后A和B之间建立TCP连接完成
2.当A和B建立TCP连接后,A又使用相同的序号1向B发送了200字节数据,不过因为网络拥塞问题,这个TCP数据报一直在网络中逗留并没有立即到达B
3.由于A发送的TCP数据报一直没到达B,正好此时A发生故障并重启,于是B就释放这条TCP连接,然后A重启后又使用序号1和B建立新的TCP连接
4.当TCP连接建立后A又使用序号1向B发送了240字节的数据,不过这次网络很稳定B马上就收到A发送的数据,注意此时A发送数据使用新的TCP连接
5.A之前发送的TCP数据报经过一段时间后终于到达B,不过该TCP数据报属于之前已经释放的旧TCP连接,B应该把这个数据报丢弃掉,但是由于A每次发送报文都使用了相同的序号(seq = 1)从而会让B误认为该数据报属于新建立的TCP连接,因此B会对该数据照收不误导致B在收到新TCP连接的数据后又收到旧TCP连接的数据从而出现数据乱序的问题3.
ISN的作用:保证消息的顺序性1.由于
A和B之间的一个TCP连接通常是由A和B的2个ip地址,2个端口号构成的四元组
2.因此当A出现了故障把该TCP连接断开之后再以相同的四元组建立新的TCP连接(A和B两次建立TCP连接都是使用相同的ip地址和端口),就会出现数据乱序的问题
3.因为只要A发送了一个TCP报文段且这个TCP报文段的四元组和序号和之前的TCP连接(四元组和序号)相同的话就会被B确认
4.这反映了TCP的一些缺点,如果被一些恶意攻击者加以利用TCP的这种缺点,选择合适的序号,ip地址和端口就能伪造出一个TCP报文段从而打断正常的TCP连接
5.但是初始化序号的方式(通过算法来随机生成序号)就会使序号难以猜出,也就不容易利用这种缺点来进行一些恶意攻击行为,且如何序号不同那么B在接收到这个序号为1的TCP报文时,发现该TCP报文的序号不在新TCP连接的接收范围内时会把这个TCP报文丢弃掉从而避免了数据乱序的问题
2.四次挥手
1.
TCP协议中断开连接需要经过四次挥手,开始时客户端和服务端都处于ESTABLISHED状态,假定客户端先发起关闭请求1.
第一次挥手1.客户端发送
FIN报文到服务器并指明客户端序列号,此时客户端处于FIN_WAIT1状态,即停止再发送数据,等待服务端的确认
2.连接释放报文段首部的同步位FIN=1,序列号sqe=u,u是一个随机生成的值2.
第二次挥手1.服务端收到客户端的
FIN报文,发送一个ACK报文且作为应答并指定自己的序列号
2.将客户端的序列号加一,即u + 1作为ack的值,表示已经收到客户端的FIN报文,此时服务端处于CLOSE_WAIT状态
3.确认报文段中ACK=1,确认号ack=u+1,序列号seq=v
4.客户端接收到服务端的确认后,进入FIN_WAIT2状态,等待服务端发出的连接释放报文段3.
第三次挥手1.服务端发送连接释放报文段,发给
FIN报文到客户端并指定服务端序列号,此时服务端处于LAST_ACK的状态,等待客户端的确认
2.连接释放报文段首部的同步位FIN=1,ACK=1,序列号seq=w,确认号ack=u+14.
第四次挥手1.客户端接收到服务端的FIN报文,发送一个
ACK报文作为应答并指定序列号
2.将服务端的序列号值加一,即w+1作为ack的值,序列号seq=u+1,表示已经收到服务端的FIN报文,此时客户端处于TIME_WAIT状态,需要过一段时间以确保服务端收到自己的ACK报文之后才会进入CLOSED状态
3.服务端收到ACK报文之后关闭连接,处于CLOSED状态
4.客户端收到服务端的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),客户端进入TIME_WAIT(时间等待)状态,此时TCP未释放掉,需要经过等待计时器设置的时间2MSL后,客户端才进入CLOSED状态2.需要四次挥手的原因
1.由于
TCP的半关闭(half-close)导致
2.半关闭:TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力3.
TCP的连接的拆除需要发送四个包,因此称为四次挥手(Four-way handshake),客户端或服务器均可主动发起挥手动作
4.具体文章可参考https://www.cnblogs.com/java1024/p/15009814.html
2.UDP协议
1.
UDP(User Datagram Protocol):用户数据报协议
2.UDP协议是一种无连接,不可靠的传输层协议1.
无连接:传输数据前不用在客户和服务器之间建立连接,且没有超时重发等机制,因此传输速度快
2.不可靠:只负责发送数据报但不能保证一定送到目的地3.
UDP支持一对一,一对多(广播,组播),多对一传递方式,而TCP只支持一对一连接通信
3.TCP与UDP的区别
1.
TCP面向连接而UDP无需连接
2.TCP保证数据可靠性,UDP可能会丢失数据
3.TCP保证数据顺序,UDP无法保证
4.TCP会将数据拆分成数据块,UDP是面向报文的,既不拆分也不合并而是保留这些报文的边界
4.HTTP协议
1.
HTTP(HyperText Transfer Protocol):超文本传输协议
2.HTTP协议是一种短连接,无状态,基于TCP协议的应用层传输协议1.无状态
1.
HTTP协议本身不会对发送过的请求和相应的通信状态进行持久化处理
2.目的是为了保持HTTP协议的简单性,从而能够快速处理大量的事务,提高效率
3.由于HTTP是无状态协议,因此如果需要记录状态可以使用Cookie或Session记录保存2.短连接
1.客户端和服务端进行一次
HTTP请求/响应之后就关闭连接
2.HTTP/1.0中默认使用的是短连接,即浏览器和服务器每进行一次HTTP操作就建立一次连接,但任务结束就中断连接
3.HTTP/1.1起默认使用长连接用以保持连接特性,使用长连接的HTTP协议会在响应头加入代码Connection:keep-alive
4.长连接:当网页打开完成后客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页会继续使用已经建立的连接3.
HTTP协议属于应用层,建立在传输层协议TCP之上,客户端通过与服务器建立TCP连接之后发送HTTP请求与接收HTTP响应都是通过访问Socket接口来调用TCP协议实现
1.HTTP请求
1.
HTTP请求由三部分构成1.
请求行:定义本次请求的请求方式, 请求的地址, 以及所遵循的HTTP协议版本
GET /example.html HTTP/1.1 (CRLF)1.请求方法
1.
GET: 请求获取Request-URI所标识的资源
2.POST:Request-URI所标识的资源后增加新的数据
3.HEAD: 请求获取由Request-URI所标识的资源的响应消息报头
4.PUT: 请求服务器存储或修改一个资源并用Request-URI作为其标识
5.DELETE: 请求服务器删除Request-URI所标识的资源
6.TRACE: 请求服务器回送收到的请求信息,主要用于测试或诊断
7.CONNECT: 保留将来使用
8.OPTIONS: 请求查询服务器的性能或查询与资源相关的选项和需求2.
URL字段
3.HTTP Version2.
消息报头:由一系列的键值对组成,允许客户端向服务器端发送一些附加信息或客户端自身的信息
3.请求正文:只有在发送POST请求时才会有请求正文(即负载),GET方法并没有请求正文
2.HTTP响应
1.
HTTP响应也由三部分构成1.状态行
HTTP/1.1 200 OK (CRLF)1.
HTTP协议的版本
2.状态码
3.状态码的文本描述2.消息报头
3.响应正文2.具体可参考
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS
3.GET请求与POST请求的区别
1.
GET请求一般用于取获取数据;而POST请求一般用于提交数据
2.GET请求参数放在URL中,隐私性,安全性较差;而POST请求参数放在请求体中,隐私性,安全性较好
3.GET请求参数的长度有限制;而POST请求参数的长度没有限制;注意该限制是指不同浏览器的限制,但是HTTP协议规范没有对URL长度进行限制
4.GET请求可以被缓存;而POST请求不会被缓存
具体可参考https://zhuanlan.zhihu.com/p/275695831和https://blog.csdn.net/weixin_44949840/article/details/117442567
4.Cookie和Session
1.Cookie
1.
Cookie诞生原因:因为HTTP是一种无状态的协议,无法记录用户的状态和信息
2.Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,实际上Cookie是服务器在本地机器上存储的一小段文本,并随着每次请求发送到服务器
3.Cookie技术通过请求和响应报文中写入Cookie信息来控制客户端的状态,Cookie会根据响应报文里的Set-Cookie首部字段信息,通知客户端保存Cookie,当下客户端再向服务端发起请求时会自动在请求报文中加入Cookie值发送出去,服务端发现客户端发送过来的Cookie后会检查是哪个客户端发送过来的请求,然后获取对应服务器上的记录得到之前的状态信息
4.Cookie的工作原理
![]()
1.浏览器端第一次发送请求到服务器端
2.服务器端创建Cookie,该Cookie中包含用户的信息,然后将该Cookie发送到浏览器端
3.浏览器端再次访问服务器端时会携带服务器端创建的Cookie
4.服务器端通过Cookie中携带的数据区分不同的用户
2.Session
2.
Session的工作原理
![]()
1.浏览器端第一次发送请求到服务器端,服务器端创建一个
Session,同时会创建一个特殊的Cookie,name为JSESSIONID的固定值,value为session对象的ID,然后将该Cookie发送至浏览器端
2.浏览器端发送第N(N>1)次请求到服务器端,浏览器端访问服务器端时就会携带该name为JSESSIONID的Cookie对象
3.服务器端根据name为JSESSIONID的Cookie的value去查询Session对象从而区分不同用户
4.如果name为JSESSIONID的Cookie不存在(关闭或更换浏览器),则重复步骤1重新创建Session与特殊的Cookie
5.Session对象默认存活30分钟
3.Cookie和Session的区别
1.
Cookie数据存放在用户的浏览器上;而Session数据存放在服务器上
2.Cookie不安全,通过存放在本地的Cookie进行Cookie欺骗,而Session安全,将登陆等重要信息存放为Session,其他信息可以放在Cookie
3.Cookie减轻服务器性能,而Session占用服务器的性能
4.单个Cookie在客户端的限制是3K,而Session的大小没有限制
5.HTTP与HTTPS的区别:
1.
HTTPS需要到CA申请证书,而HTTP不需要
2.HTTPS密文传输,而HTTP明文传输
3.HTTPS默认使用443端口,而HTTP默认使用80端口
4.HTTPS=HTTP+ 加密+认证+完整性保护,比HTTP安全
3.Socket
1.套接字概念
package com.socket; import java.io.InputStreamReader; import java.io.Reader; import java.net.ServerSocket; import java.net.Socket; public class ServerSocketTest { public static void main(String[] args) { int port = 8919; try { ServerSocket server = new ServerSocket(port); System.out.println("等待接收..."); while (true) { Socket socket = server.accept(); Reader reader = new InputStreamReader(socket.getInputStream()); char chars[] = new char[1024]; int len; StringBuilder builder = new StringBuilder(); while ((len=reader.read(chars)) != -1) { builder.append(new String(chars, 0, len)); } System.out.println("Receive from client message: " + builder); } // reader.close(); // socket.close(); // server.close(); } catch (Exception e) { e.printStackTrace(); } } }package com.socket; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; import java.net.Socket; public class ClientSocketTest1 { public static void main(String[] args) { String host = "127.0.0.1"; int port = 8919; try { Socket client = new Socket(host, port); Writer writer = new OutputStreamWriter(client.getOutputStream()); writer.write("Hello From Client1"); writer.flush(); writer.close(); client.close(); System.out.println("发送成功!"); } catch (IOException e) { e.printStackTrace(); } } }package com.socket; import java.io.*; import java.net.Socket; public class ClientSocketTest2 { public static void main(String[] args) { String host = "127.0.0.1"; int port = 8919; try { Socket client = new Socket(host, port); Writer writer = new OutputStreamWriter(client.getOutputStream()); writer.write("Hello From Client2"); writer.flush(); writer.close(); client.close(); System.out.println("发送成功!"); } catch (IOException e) { e.printStackTrace(); } } }
1.
Socket:套接字,其是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元,Socket本质是IP地址和端口号的组合
2.Socket是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息1.连接使用的协议
2.本地主机的IP地址
3.本地进程的协议端口
4.远地主机的IP地址
4.远地进程的协议口3.
应用层通过传输层进行数据通信时,TCP会同时为多个应用程序进程提供并发服务
4.当多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据,此时为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口
5.应用层可以和传输层通过Socket接口区分来自不同应用程序进程或网络连接的通信,从而实现数据传输的并发服务
2.建立Socket连接
1.建立
Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket,另一个运行于服务器端,称为ServerSocket
2.套接字之间的连接过程分为三个步骤1.
服务器监听1.服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求
2.
客户端请求1.指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字
2.因此客户端的套接字必须首先指定要连接的服务器的套接字,即指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求3.
连接确认1.当服务器端套接字监听到或接收到客户端套接字的连接请求时就响应客户端套接字的请求
2.建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接
3.服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求
3.SOCKET连接与TCP连接
1.创建
Socket连接时可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接
4.Socket连接与HTTP连接
1.通常情况下
Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开
4.WebSocket
1.
WebSocket协议一种双向通讯,有状态,基于TCP/IP的通信协议
2.WebSocket是应用在浏览器的Socket,是Socket模型接口的实现
3.WebSocket协议端口是80
4.WebSocket SSL协议端口是443
5.WebSocket协议不受同源策略影响
具体可参考https://cloud.tencent.com/developer/article/1887095
1.ICMP协议
1.ICMP的定义
1.
ICMP(Internet Control Message Protocol,互联网控制消息协议)是一种网络层协议,主要用于在IP网络中发送错误消息和操作信息
2.ICMP是一个无连接的协议,通常用于网络层,与IP协议紧密配合使用
2.ICMP的功能
1.错误报告
1.目的不可达(
Destination Unreachable):当数据包无法到达目标地址时(如目标主机不可达、端口不可达等)
2.超时(Time Exceeded):当数据包的TTL(Time To Live)值减为0时,数据包被丢弃,发送方会收到超时消息
3.参数问题(Parameter Problem):当数据包的格式或参数有问题时,发送方会收到参数问题消息2.诊断工具
1.回显请求(
Echo Request)和回显响应(Echo Reply):用于ping命令,测试主机之间的连通性
2.时间戳请求(Timestamp Request)和时间戳响应(Timestamp Reply):用于测量往返时间,帮助同步时钟3.网络管理:
1.重定向(
Redirect):当路由器发现更好的路径时,可以发送重定向消息,通知主机使用更优的路由
3.ICMP的数据包格式
4.ICMP的应用场景
1.网络诊断:
1.
ping命令:通过发送ICMP回显请求和接收回显响应来测试主机之间的连通性
1.traceroute命令:通过发送ICMP超时消息来跟踪数据包的路径2.错误报告:
1.当数据包无法到达目标地址时,路由器或目标主机可以发送
ICMP错误消息,通知发送方3.网络管理:
1.路由器可以发送
ICMP重定向消息,通知主机使用更优的路由
5.ICMP 的安全问题
1.
ICMP消息可能会被用于恶意目的(如ICMP洪水攻击,通过发送大量的ICMP回显请求来淹没目标主机导致网络拥塞)
2.ICMP重定向攻击:恶意路由器可以发送虚假的ICMP重定向消息,引导流量通过恶意路径
3.网络管理员通常会配置防火墙规则,限制ICMP消息的传输,以防止潜在的安全威胁


![图片[1] - 计算机网络 – 2.基础协议 - 宋马](https://pic.songma.com/blogimg/20250525/4a985c97fdb54855b3832e43c9e5388d.png)







![图片[2] - 计算机网络 – 2.基础协议 - 宋马](https://pic.songma.com/blogimg/20250525/7280c35dfbff45ffb8dcebc16901aff4.png)



![图片[3] - 计算机网络 – 2.基础协议 - 宋马](https://pic.songma.com/blogimg/20250525/2785f49e29b148c793c82cdfcdeb2771.png)
![图片[4] - 计算机网络 – 2.基础协议 - 宋马](https://pic.songma.com/blogimg/20250525/5b09477721ad4917a656e9439a2740fd.png)
![图片[5] - 计算机网络 – 2.基础协议 - 宋马](https://pic.songma.com/blogimg/20250525/a673a21ae87b4ee4992971d604fbe4a4.png)
![图片[6] - 计算机网络 – 2.基础协议 - 宋马](https://pic.songma.com/blogimg/20250525/eb14bd5d41a644f79638b1944ee37063.png)
![图片[7] - 计算机网络 – 2.基础协议 - 宋马](https://pic.songma.com/blogimg/20250525/d4dee8c1bc2d4172be2aa4059b20f2e2.png)
![图片[8] - 计算机网络 – 2.基础协议 - 宋马](https://pic.songma.com/blogimg/20250525/34d90b4630a0464880b4147d353f7417.png)



















暂无评论内容