Tcp传输之前建立连接要进行“三次握手”,断开连接要进行“四次挥手”。
seq是数据包本身的序列号,这是为了连接以后传送数据用的,ack是对收到的数据包的确认,值是期待接收的数据包的序列号。
在第一次消息发送中,A随机选取一个序列号作为自己的初始序号发送给B;第二次消息B使用ack对A的数据包进行确认,因为已经收到了序列号为x的数据包,准备接收序列号为x+1的包,所以ack=x+1,同时B告诉A自己的初始序列号,就是seq=y;第三条消息A告诉B收到了B的确认消息并准备建立连接,A自己此条消息的序列号是x+1,所以seq=x+1,而ack=y+1是表示A正准备接收B序列号为y+1的数据包。
为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。
(因为收到SYN报文后,己方可能还有东西需要发送,所以先发送ACK,再发送SYN)
网络中的七层协议
表示层, 帮我们解决不同系统之间的通信语法问题(例如Linux传向Windows)
会话层, 建立和管理应用程序之间的通信。
传输层, 可以传输大量文件,对数据进行封装。
网络层,即路由器,交换价那些具有寻址功能的设备所实现的功能。这一层定义的是IP地址,通过IP地址寻址。所以产生了IP协议。
链路层, 通过无线电波等其它介质传输,具有纠错功能。
物理层, 主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。这一层传输的数据叫做比特。
TCP,是用于发大量数据的,我发了1万个包出去,另一台电脑就要告诉我是否接受到了1万个包,如果 缺了3个包,就告诉我是第1001,234,8888个包丢了,那我再发一次。这样,就能保证对方把这个视频完整接收了。
UDP,是用于发送少量数据的。我发20个包出去,一般不会丢包,所以,我不管你收到多少个。在多人互动游戏,也经常用UDP协议,因为一般都是简单的信息,而且有广播的需求。如果用TCP,效率就很低,因为它会不停地告诉主机我收到了20个包,或者我收到了18个包,再发我两个!如果同时有1万台计算机都这样做,那么用TCP反而会降低效率,还不如用UDP,主机发出去就算了,丢几个包你就卡一下,算了,下次再发包你再更新。
TCP协议是会绑定IP和端口的协议。