小木箱@Singapore

Results 90 issues of 小木箱@Singapore

因为tcp是全双工,为保证传输的可靠性,需要给每次传输的数据段添加序号,那么初始的序列号就是tcp三次握手真正的意义所在,而为了确保交换双方的初始序号,最少需要三次才行 采用“三次握手”的办法可以防止上述现象发生: - Client不会向Server的确认发出确认 - Server由于收不到确认,就知道Client并没有要求建立连接 - 所以Server不会等待Client发送数据,资源就没有被浪费 - TCP释放连接 TCP释放连接需要**四次挥手**过程,现在假设A主动释放连接:(数据传输结束后,通信的双方都可释放连接) - 第一次挥手:A发送释放信息到B;(发出去之后,A->B发送数据这条路径就断了) - 第二次挥手:B收到A的释放信息之后,回复确认释放的信息:我同意你的释放连接请求 - 第三次挥手:B发送“请求释放连接“信息给A - 第四次挥手:A收到B发送的信息后向B发送确认释放信息:我同意你的释放连接请求 > B收到确认信息后就会正式关闭连接; A等待2MSL后依然没有收到回复,则证明B端已正常关闭,于是A关闭连接 ![image](https://user-images.githubusercontent.com/17723631/97496781-71d44600-19a4-11eb-8f22-7f8c061edae8.png)

为了保证双方都能通知对方“需要释放连接”,即在释放连接后都无法接收或发送消息给对方 - 需要明确的是:TCP是全双工模式,这意味着是双向都可以发送、接收的 - 释放连接的定义是:双方都无法接收或发送消息给对方,是双向的 - 当主机1发出“释放连接请求”(FIN报文段)时,只是表示主机1已经没有数据要发送 / 数据已经全部发送完毕; > 但是,这个时候主机1还是可以接受来自主机2的数据。 - 当主机2返回“确认释放连接”信息(ACK报文段)时,表示它已经知道主机1没有数据发送了 但此时主机2还是可以发送数据给主机1 - 当主机2也发送了FIN报文段时,即告诉主机1我也没有数据要发送了 此时,主机1和2已经无法进行通信:主机1无法发送数据给主机2,主机2也无法发送数据给主机1,此时,TCP的连接才算释放

为了保证双方都能通知对方“需要释放连接”,即在释放连接后都无法接收或发送消息给对方 - 需要明确的是:TCP是全双工模式,这意味着是双向都可以发送、接收的 - 释放连接的定义是:双方都无法接收或发送消息给对方,是双向的 - 当主机1发出“释放连接请求”(FIN报文段)时,只是表示主机1已经没有数据要发送 / 数据已经全部发送完毕; > 但是,这个时候主机1还是可以接受来自主机2的数据。 - 当主机2返回“确认释放连接”信息(ACK报文段)时,表示它已经知道主机1没有数据发送了 但此时主机2还是可以发送数据给主机1 - 当主机2也发送了FIN报文段时,即告诉主机1我也没有数据要发送了 此时,主机1和2已经无法进行通信:主机1无法发送数据给主机2,主机2也无法发送数据给主机1,此时,TCP的连接才算释放

##### Socket服务端的编写 - Step 1:创建ServerSocket对象,绑定监听的端口 - Step 2:调用accept()方法监听客户端的请求 - Step 3:连接建立后,通过输入流读取客户端发送的请求信息 - Step 4:通过输出流向客户端发送响应信息 - Step 5:关闭相关资源 ```java public static void main(String[] args) throws IOException { //1.创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口 ServerSocket serverSocket =...

- Step 1:创建ServerSocket和Socket - Step 2:打开连接到的Socket的输入/输出流 - Step 3:按照协议对Socket进行读/写操作 - Step 4:关闭输入输出流,以及Socket

- 即套接字,**是一个对 TCP / IP协议进行封装 的编程调用接口(API)** 用來描述IP地址和端口,是通信链的句柄,应用程序可以通过Socket向网络发送请求或者 应答网络请求 Socket是支持TCP/IP协议的网络通信的基本操作单元,是对网络通信过程 中端点的抽象表示,包含了进行网络通信所必须的五种信息 1. 连接所使用的的协议 2. 本地主机的IP地址 3. 本地远程的协议端口 4. 远程主机的IP地址 5. 远地进程的协议端口 > 1. 即通过`Socket`,我们才能在Andorid平台上通过 `TCP/IP`协议进行开发 > 2. `Socket`不是一种协议,而是一个编程调用接口(`API`),属于传输层(主要解决数据如何在网络中传输) > 3. 成对出现,一对套接字...

这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。

![image](https://user-images.githubusercontent.com/17723631/97495000-1608bd80-19a2-11eb-8f1d-066e11a9231d.png) ![image](https://user-images.githubusercontent.com/17723631/97495012-1acd7180-19a2-11eb-9e3e-f8907b05d042.png)

![image](https://user-images.githubusercontent.com/17723631/97493881-91696f80-19a0-11eb-9f72-3315a258ad14.png)

![image](https://user-images.githubusercontent.com/17723631/97494205-f45b0680-19a0-11eb-923a-fc89905c8017.png) ![image](https://user-images.githubusercontent.com/17723631/97494215-fae97e00-19a0-11eb-9e62-bd4e45c02910.png) ![image](https://user-images.githubusercontent.com/17723631/97494229-ff159b80-19a0-11eb-88f8-5577db2e9708.png) ![image](https://user-images.githubusercontent.com/17723631/97494239-02a92280-19a1-11eb-95b9-857bbddae1d1.png)