TCP与Socket

最近要使用socket与一些外联的系统进行通信,为了方便理解,这里整理下TCP协议的三次握手与Socket基础知识。

一、TCP的三次握手过程

首先,TCP是属于可靠传输协议,因此它需要一定的机制来保证传输数据的可靠性,比如长连接,数据校验、重传等。

TCP报文头包含以下信息,参考:https://blog.csdn.net/qq_25948717/article/details/80382766

1、client: 发送建立连接的报文,这时,会将标志位SYN置位1,另外带上一个随机数字作为本次消息的标识sequence number = m。(SYN=1,seq=m)其中syn表示请求建立连接,seq是对报文的一个编号,它随着报文的发送而递增。接收方能够按照seq对数据进行恢复排列(比如由于网络路由原因seq=20的报文比seq=19的报文先到达)

2、如果Server端收到了建立连接的请求报文,则在返回的报文中,将ACK、SYN置位1,同时Sequence number = n, Acknowledgment number=m+1(SYN=1,ACK=1,Seq=n,ack number=m+1)

3、Client端收到Server端的请求之后,则返回(seq=m+1, ack=1,ack number=n+1)的报文,此时链接便能够建立了。

4、连接已经建立,client 发送(seq=m+1,ack=1,data)正式发送数据

问题:为什么时三次握手?

假设是一次,client发完建立连接请求之后,就开始发送数据,那么。。。万一服务端根本就没有收到请求呢?那么服务端不会做任何准备,之后客户端发送的数据就白发了。

假设是两次,client发送完毕数据之后,服务端回传了数据,这个时候如果认为连接建立了,那么服务端会等待客户端发送数据过来。但是,如果第一步客户端发送的连接请求是因为网络原因,延迟了很久才到达的,这个时候,客户端不会认为已经建立了连接了,因此不会发送数据。这样会导致服务端资源被浪费。另外,如果没有收到client的ack,有可能会有旧的连接的数据过来,这个时候服务端接收的数据是不正确的,自然是需要被丢弃。

只有三次,client发送完毕数据之后,服务端回传了数据,然后客户端确认连接建立,这之后,客户端发送的数据才能正确被服务端接收。如果server一直没有收到client的确认,那么它会一直重传,直到收到client的ack。这样才能保证在后续的步骤里Server能够往Client发送正确的数据。

补充一段知乎上额回答:

 

 

 

二、Socket 通信

Socket会通过TCP建立连接,然后传输数据。

 

posted @ 2020-06-12 17:04  sliec  阅读(408)  评论(0编辑  收藏  举报