什么是TCP/IP
TCP:用于应用程序之间的通信。
这个全双工的通信将占用两个计算机之间的通信线路,直到它被一方或双方关闭为止。
IP: 用于计算机之间的通信。
是无连接的通信协议。它不会占用两个正在通信的计算机之间的通信线路,IP 负责将每个包路由至它的目的地。
TCP/IP:意味着 TCP 和 IP 在一起协同工作。
TCP负责应用软件(比如您的浏览器)和网络软件之间的通信。
IP 负责计算机之间的通信。
TCP 负责将数据分割并装入 IP 包,然后在它们到达的时候重新组合它们。
IP 负责将包发送至接受者。
IP层的ip地址可以唯一标示主机,而TCP层协议和端口号可以唯一标示主机的一个进程
利用:ip地址+协议+端口号唯一标示网络中的一个进程。
什么是socket
socket是进程通讯的一种方式,就是两个进程,跨计算机,他俩需要通讯的话,需要通过网络对接起来。
socket的结构
socket的结构很简单,只有三个元素,协议,端口号,IP地址
socket位于应用层与传输层之间
Socket通信流程
socket是"打开—读/写—关闭"模式的实现。
socket通信文字化
1.服务器创建socket
2.服务器为socket绑定ip地址和端口号
3.服务器socket监听端口号请求
4.客户端创建socket
5.客户端打开socket,根据服务器ip地址和端口号试图连接服务器socket
6.客户端连接成功,向服务器发送连接状态信息;服务器accept方法返回,连接成功
7.客户端向socket写入信息;服务器读取信息
8.客户端关闭;服务器端关闭
三次握手
在TCP/IP协议中,TCP协议通过三次握手建立一个可靠的连接
第一次握手:客户端尝试连接服务器,向服务器发送syn包(同步序列编号Synchronize Sequence Numbers),syn=j,客户端进入SYN_SEND状态等待服务器确认
第二次握手:服务器接收客户端syn包并确认(ack=j+1),同时向客户端发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手
四次挥别
1.客户端发送FIN用来关闭客户端到服务器的数据传输;
2.服务器收到客户端的FIN,发回一个ACK表示收到关闭请求;
3.服务器向客户端发送一个FIN,表示关闭服务器到客户端的数据传输;
4.客户端发回ACK报文确认
因为TCP链接是全双工的,因此每个方向都必须要单独进行关闭。
问题
为什么连接的时候是三次握手,关闭的时候却是四次挥别?
当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文。
为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。