应用通信

TCP/IP

TCP四层模型
应用层、传输层、网络层、链路层、物理传输层
OSI七层模型
表达层和会话层
三次握手协议
三次握手协议是指在发送数据的准备阶段,服务器和客户端之间需要进行三次交互。
具体过程
image
以下参考:https://www.cnblogs.com/qq78292959/p/3922231.html
SYN(synchronous建立联机)
ACK(acknowledgement确认)
PSH(push传送)
FIN(finish结束)
RST(reset重置)
URG(urgent紧急)
sequence number(顺序号码)
Acknowledge number(确认号码)
第一次握手:
A发送位码为syn=1,随机产生seqNumber=1234567的数据包到服务器B,B由SYN为1得知A请求建立联接。
第二次握手:
B接收到请求后要确认联机信息,向主机A发送ACK number=主机元发送seqNumber+1,随机产生seq=78947561423的包。
第三次握手:
A接收到确认信息后检查ack number是否正确,也就是第一次发送的seqNumber+1,以及确认Ack是否为1,如果正确,A会发送acknumber=(主机B seqnumber+1),ack=1,主机确认seq值,ack=1则建立成功。
至此完成三次握手,AB开始传输数据。

第一次握手:
建立连接时,客户端向服务器发送一个SYN(syn=j)包(握手信号),客户端进入SYN_SENT状态,等待服务器确认。
第二次握手:
服务器收到SYN包之后,向客户端发送一个SYN(syn=j+1)包和ACK包,此时服务器进入SYN_RECV状态。
第三次握手:
客户端收到服务器的SYN+ACK之后,向服务器发送ACK(seqNumber+1)包。至此,服务器和客户端链接建立。进入Established(建立)状态,完成三次握手。
三次握手完成,服务器和客户端开始传输数据。

实例

IP 192.168.1.116.3337 > 192.168.1.123.7788:S3626544836:3626544836
IP 192.168.1.123.7788 > 192.168.1.116.3337: S1739326486:1739326486 ack3626544837
IP 192.168.1.116.3337 > 192.168.1.123.7788: ack1739326487,ack 1
第一次握手:192.168.1.116发送位码syn=1,随机产生seqnumber=3626544836的数据包到192.168.1.123,192.168.1.123由SYN=1知道192.168.1.116要求建立联机;

第二次握手:192.168.1.123收到请求后要确认联机信息,向192.168.1.116发送acknumber=3626544837,syn=1,ack=1,随机产生seq=1739326486的包;
第 三次握手:192.168.1.116收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,192.168.1.116会再发送ack number=1739326487,ack=1,192.168.1.123收到后确认seq=seq+1,ack=1则连接建立成功。

核心思想
TCP是一种可靠的传输控制协议。目的是:既要保证数据的可靠传输,又要提高传输效率。
三次握手简单可以理解为:
A发,B收->B知道A能发
B发,A收->A知道B能发能收
A发,B收->B知道A能收
三次握手不是TCP的本身要求,只是为了满足在不可靠的信道上可靠传递消息的最低保障。

四次挥手
image
简介
TCP连接是双工的,所以每个方面也就是建立连接的两个主机,都需要单独进行关闭。这个原则是当一方完成它的数据发送任务之后就发送一个FIN来种植这个方向的连接。收到一个FIN只以为着这一个方向上没有数据流动。一个TCP连接在接收到FIN后仍能发送数据。首先进行关闭的一方执行主动关闭,另一方执行被动关闭。
1、A发送FIN,用来关闭A到服务器的数据传输。
2、B收到FIN,返回ACK,确认序号为收到的序号+1,和SYN一样,一个FIN占用一个序号。
3、服务器B关闭与A的连接发送一个FIN给客户端A
4、客户端发ACK报文确认,并将确认序号设置为收到的序号+1

1.为什么建立连接协议是三次握手?

client发送的报文如果因某种原因在传输过程中某一个节点长时间滞留,导致该请求在连接断开之后才发送到server。server会再次向client发送确认报文段,请求建立连接。假如没有三次握手,只要server发出确认,连接就进行建立,但是client并没有发出确认信息,也就不会理睬server的确认,更不会发送数据信息。但server一直在等待新的连接建立,这就造成了server端资源的浪费。

2.为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?

这是因为虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。

1.为什么是四次挥手?

tcp是双工模式,当client发出FIN报文时,只是表示已经没有数据需要发送了,告知server。但是,client还可以接受数据;server返回ack报文段时,表示已经知道client没有新的数据传输了,但是server还是可以发送数据到client的;server发送fin之后,告知client没有数据发送了;client收到后发送确认报文,之后连接中断。

HTTP/HTTPS

HTTP

超文本传输协议,建立在TCP上的无状态连接,基本工作流程是客户端发送一个HTTP请求,说明客户端想要访问的资源和请求的动作;服务器接收到请求后开始处理,并根据请求作出相应的动作访问服务器资源;最后通过HTTP相应将结果返回给客户端。
其中一个请求的开始到结束成为事务,当一个事务结束之后会在服务端添加一条日志。

HTTP请求

HTTP请求就是客户端往服务器发送请求动作,告知服务器自己的要求。
HTTP请求由状态行、请求头、请求正文三部分组成:
状态行:包含请求方式method、资源路径URL、协议版本version组成
请求头:包含域名、用户代理、cookie等信息
请求正文:HTTP请求的数据
请求方式的method一般有get、post、put、delete。
GET:正文部分一般在url中进行添加,所以get请求一般会将正文省略。其他方式的传输会设计到请求数据的传输,所以正文一般都是有的。

HTTP响应

服务器接收到来自客户端的请求之后,会根据请求进行对应的业务处理,将结果返回给客户端,这就是Http响应。
响应主要由状态行、响应头、响应正文组成。
状态行:包含协议版本version、状态码Status Code、回应短语组成
响应头:包含搭建服务器的软件、发送响应的时间、回应数据的格式等信息
响应正文:具体的响应数据

状态码

1xx 表示请求已接收,继续处理请求
2xx 请求已经处理完成
3xx 将请求进行URL冲定向到其他目录
4xx 客户端出现错误
5xx 服务器端出现错误

HTTP响应模型

单进程
服务器开启一个进程。一个进程只能处理一个请求,并且对请求顺序处理。
多进程
服务器并行开启多个进程。同时处理多个请求。
复用
开启一个进程,同时开启多个线程处理业务。
复用多线程
服务器并行开启多个进程。同时每个进程开启多个线程。

HTTP报文格式

HTTP报文包含请求和响应报文,大致格式都是有起始、首部、主体三部分组成。
起始说明报文的动作。首部说明报文的属性。主体是报文的数据。

请求报文


请求报文的起始有状态行(请求行)构成,用来说明请求想要做什么,有method/URL/version三个字段组成。每个字段之间有空格
首部部分有多个请求头构成。大致包含Host 服务器域名,connection是否开启持久连接(alive),user-agent用户代理,向服务器说明自己的操作系统和浏览器信息,accept-encoding 客户端可以接受的编码类型,accept-language 客户端可以接受的语言类型,accept 客户端可以接受的内容格式类型

响应报文


响应报文的初始由状态行构成,用来说明服务器做了什么。由version、status-code、phrase三个字段构成,空格隔开
首部由多个响应头组成大致包含以下字段Server 服务器软件名,Date 服务器发送报文的时间,Last-Modified 请求资源的最后修改时间

以上参考:https://blog.51cto.com/13570193/2108347

你可能感兴趣的:(java基础,通信协议,tcp/ip,http)