这里写目录标题
1、 什么是C/S架构?
C指的是client(客户端软件),S指的是Server(服务端软件)
一个C/S架构就是,实现服务端软件与客户端软件基于网络通信。
1.1 C/S架构与socket的关系
学习socket就是为了完成C/S架构的开发
2、 基于tcp协议通信,为何建立链接需要三次握手,而断开链接却需要四次挥手
2.1 为什么要三次挥手?
在只有两次“握手”的情形下,假设Client想跟Server建立连接,但是却因为中途连接请求的数据报丢失了,故Client端不得不重新发送一遍;这个时候Server端仅收到一个连接请求,因此可以正常的建立连接。
但是,有时候Client端重新发送请求不是因为数据报丢失了,而是有可能数据传输过程因为网络并发量很大在某结点被阻塞了,这种情形下Server端将先后收到2次请求,并持续等待两个Client请求向他发送数据…问题就在这里,Cient端实际上只有一次请求,而Server端却有2个响应,极端的情况可能由于Client端多次重新发送请求数据而导致Server端最后建立了N多个响应在等待,因而造成极大的资源浪费!所以,“三次握手”很有必要!
2.2 为什么要四次挥手?
试想一下,假如现在你是客户端你想断开跟Server的所有连接该怎么做?
第一步,你自己先停止向Server端发送数据,并等待Server的回复。
但事情还没有完,虽然你自身不往Server发送数据了,但是因为你们之前已经建立好平等的连接了,所以此时他也有主动权向你发送数据;
故Server端还得终止主动向你发送数据,并等待你的确认。其实,说白了就是保证双方的一个合约的完整执行!
三次握手:client发送请求建立通道;server收到请求并同意,同时也发送请求建通道;client收到请求并同意,建立完成
四次挥手:client发送请求断开通道;server收到请求并同意,同时还回复client上一条消息;server也发送请求断开通道;client受到消息结束
2.3 为什么TCP协议终止链接要四次?
1、当主机A确认发送完数据且知道B已经接受完了,想要关闭发送数据口(当然确认信号还是可以发),就会发FIN给主机B。
2、主机B收到A发送的FIN,表示收到了,就会发送ACK回复。
3、但这是B可能还在发送数据,没有想要关闭数据口的意思,所以FIN与ACK不是同时发送的,而是等到B数据发送完了,才会发送FIN给主机A。
4、A收到B发来的FIN,知道B的数据也发送完了,回复ACK, A等待2MSL以后,没有收到B传来的任何消息,知道B已经收到自己的ACK了,A就关闭链接,B也关闭链接了。
3、为何基于tcp协议的通信比基于udp协议的通信更可靠?
tcp:可靠 对方给了确认收到信息,才发下一个,如果没收到确认信息就重发
udp:不可靠 一直发数据,不需要对方回应
(1)UDP:user datagram protocol(用户数据报协议)
特点:
——1:面向无连接:传输数据之前源端和目的端不需要建立连接
——2:每个数据报的大小都限制在64k(8个字节)以内
——3:面向报文的不可靠协议(即发出去的数据不一定会接收到)
——4:传输速率快,效率高
——5:现实生活实例:邮局寄件,实时在线聊天,视频协议等等
(2)TCP:transmission control protocol(传输控制协议)
特点:
——1:面向连接:传输数据之前需要建立连接
——2:在连接过程中进行大量的数据传输
——3:通过“三次握手”的方式完成连接,是安全可靠的协议
——4:传输效率低,速度慢
4、流式协议指的是什么协议,数据报协议指的是什么协议?
TCP协议,可靠传输
数据报协议: UDP协议,不可传输
也就是TCP和UDP的区别:
TCP是面向连接的,可靠的字节流服务
UDP是面向无连接的数据报服务
5、什么是socket?简述基于tcp协议的套接字通信流程流式协议
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部。
服务端:创建socket对象,绑定ip端口bind(), 设置最大链接数listen(), accept()与客户端的connect()创建双向管道, send(), recv(),close()
客户端:创建socket对象,connect()与服务端accept()创建双向管道 , send(), recv(),close()
6、什么是粘包? socket 中造成粘包的原因是什么? 哪些情况会发生粘包现象?
粘包:数据粘在一起
主要因为:接收方不知道消息之间的界限,不知道一次性提取多少字节的数据造成的数据量比较小,时间间隔比较短,就合并成了一个包,这是底层的一个优化算法(Nagle算法)