TCP/IP笔记
一般可用的虚拟端口:1024-49151。
虚拟端口范围是:1-65535
TCP/IP协议的特点:
1、面向连接
2、可靠的
3、基于字节流传输的协议
4、效率较慢
5、具有端口号的概念
6、只可点对点
7、使用系统资源较多
UDP协议的特点:
1、无连接的
2、不可靠的
3、面向数据报得传输层协议
4、实时性好
5、具有端口号的概念
6、可一对多,多对一,多对多交互通信
7、使用系统资源少
TCP/IP三次握手
客户端发送链接请求,
(1)发送SYN=1;seq=x;
服务端接收到后,把它带来的同步信号(SYN=1)和序列号(seq=x)转换成
(2)SYN=1 ACK=1 seq=y,ack=x+1;
相当于:请求我做事,我还在原来的基础上给你加一份礼物
(3)客户端接收到请求确认之后我在让你发送连接确认,此时SYN同步信号消失了,因为我是要服务端进行确认,发送的是ACK=1,seq=x+1,ack=y+1;
服务端接确认之后,就开始传送数据了。
TCP/IP四次挥手
(1)客户端主动释放
发送希望断开信号(FIN=1),seq=u
(2)服务器接收到后
发送ACK=1,seq=v,ack=u+1
即自己收到了,在客户端给的u上加个1,还带确认信号(ACK=1),seq=v,少了FIN=1
相当于说,再我收到了,等等处理我还有其它任务要完成。
(3)服务器完成自己的工作后,再发送
Fin=1,ACK=1,seq=w,ack=u+1;
把之前客户端给的Fin送回去。(即连接释放报文)
(4)客户端接收到后,再发出确认关闭报文,ACK=1,seq=u+1,ack=w+1,
(5)服务端接收到后,立即进入CLOSED状态
常见面试问题
问题1、为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
问题2如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
参考:
https://cnblogs.com/renyz/p/11233858.html