OSI参考模型 与 TCP/IP模型
应用层 - > 应用层
表示层
会话层
传输层 -> 传输层
数据链路层 -> 网络接口层
物理层
一般主要考察TCP/IP,因为TCP/IP才是常用的,OSI只是理想上
各层设备及传输单位
物理层:中继器 集线器 单位:bit流
数据链路层:网桥 交换机 网卡 单位:帧
网络层:路由器 三层交换机 单位:包
传输层及以上: 网关 单位: 段
TCP 与 UDP
UDP:udp提供数据报服务,面向无连接的,他的数据不保证顺序发送,他的传输速度比较快,并且可以同时建立多个连接,但是容易丢包并且没有应对措施,不安全不可靠,应用于实时性比较强的场合,如流媒体,还有广播
TCP:tcp提供可靠传输,速度比较慢,比UDP多了三次握手的过程,还有他的功能,流量控制,拥塞控制,路由选择,会考虑当前网络环境的好坏,如果网络差,会为了防止丢包而暂缓发送数据,所以会比UDP慢上很多,按顺序发送,但是不一定是按顺序到达
TCP的建立连接与终止(重中之重)
TCP建立连接调用函数步骤
1,服务器端调用socket()连接
2,服务器端调用bind()指定服务端口
3,服务器端调用listen()等待监听客户端的到来
4,客户端调用socket()建立连接
5,客户端调用connect()主动连接服务器端,(注意,三次握手操作也是这里执行的,但是并不是由这个函数完成,这个只是去通知linux内核,让内核去实现三次握手)
6,服务器端调用acept()进行完成连接
7,相互通信传数据
8,客户端close(),完成结束
三次握手
注意名词含义
syn 代表一串序列号,连接请求和连接接受的报文
ack 对发送来的报文进行确认,给予的答复
fin 终止连接的请求
步骤:
1,客户端发送syn k给服务器端
2,服务器端发送 带ack k+1的syn j给服务器端
3,客户端发送 ack j+1给服务器端
通俗来说
1,客户端和服务器说 “我想和你连接”
2,服务器和客户端 “好,我收到你的消息了,我同意,你听到我说的话后回我一声”
3,客户端和服务器 “ok,我收到了”
为什么不可以两次连接而要三次?
答:因为如果两次连接的话,客户端发送的syn可能因为网络延迟还没到,客户端然后超时重传了一下,服务器和它连接后,如果后面收到之前那个syn包,就需要去向客户端确认一下,如果是两次连接,服务器端就会一直等待客户端发送数据,造成一个空连接浪费资源
四次挥手
步骤:
1,客户端发送fin给服务器
2,服务器发送ack给客户端
3,服务器发送fin给客户端
4,客户端发送ack给服务器
通俗来说
1,客户端和服务器说 "我东西传完了,我想关了"
2,服务器和客户端 “稍等一下,我东西还没传完”
3,服务器和客户端 “我东西传完了,收到消息请回复”
4,客户端和服务器 “ok,收到了”
特别说一下,可能会出现三次挥手的情况,就是当正好服务器端的数据也正好传完了,这个时候服务器可以把ack 和 syn同时发送给客户端
还提一下,为什么每次一端发送有用的信息都必须回复一下,因为如果你不回复,另一端就会认为是不是在中途丢包,你没接收到,然后就会重传,直到回复为止,这也是为了确认是否知道了消息
连接时的状态
三次握手
1,客户端发送syn 给服务器 进入 syn_sent 状态
2,服务器之前是listen 状态 收到syn后 发送 带ack的 syn 进入 syn_rcvd
3, 客户端 发送ack给服务器 进入established(连接,这个状态才可以传收数据)
4,服务器收到ack 进入 established
四次挥手
5,客户端发送FIN 进入 fin_wait1
6, 服务器回复 ack 进入close_wait 客户端进入 fin_wait2
7, 服务器发送 fin 进入last_ack
8,客户端收到进入time_wait 并且回复ack
9,服务器收到 进入closed
time_wait状态存在的理由?(存活时间2MSL)
1,防止发送的ack包没有到达,这个时候服务器没收到会重新发送syn来,如果直接断开就没搞头了
2,让外面的超时节点死掉,因为每个包都有自己的存活时间MSL,因为如果之前网络有问题,然后超时重发,重新建立连接,但是网络一好就会有重复包出现,这个时间这个状态存在,可能等过了他的存活时间再发送,因为time_wait状态时间是2MSL
为什么是2MSL呢,因为 服务器-syn-客户端 一个MSL 客户端-ack-服务器 一个MSL
其他不怎么重要和比较基础就不写了(懒 >_<)