TCP Socket在客户端和服务器中是如何建立连接的

汽车安全 3年前 (2022) admin
449 0 0

TCP Socket在Client和Server中是如何建立连接的

Server

  • 先调用函数创建tcp socket,创建的是一个“主动”套接字对象

  • 然后用这个套接字调用bind函数,传入ip和port参数,绑定ip和端口号

  • 接着调用listen函数,监听在这个端口上,等待客户端的连接请求,这一步可以让socket收到客户端的SYN报文,但是收到后协议栈并不会自动回复SYN+ACK,自动回复需要调用accept函数

  • 最后调用函数accept,如果有请求过来(SYN报文),就会让Server端的协议栈自动回复(ACK+SYN),自动完成三次握手

这里有一些需要特别注意和理解的内容:

调用listen函数会将Server端创建的“主动”socket转为“被动”socket,来不停地接收外来的客户端请求。所以listen函数传入的参数中有一个最大值的参数,表示server端允许接受的tcp连接请求的最大值

“被动”socket调用accept函数,能够让此套接字按照顺序提取监听到的来自客户端的连接请求,驱动协议栈自动完成三次握手连接,同时生成新的套接字对象。这个新的套接字用来发送数据和接收数据。断开连接时服务器关闭的socket也只是这个新的套接字,从而保证那个“被动”socket不会受到影响,可以继续监听连接请求

这里要注意,RFC 793中的LISTEN状态,应该是调用了accept函数后的状态

Client

  • 先调用函数创建tcp socket,创建的是一个“主动”套接字对象

  • 然后用这个套接字调用bind函数,传入ip和port参数,绑定ip和端口号

  • 接着调用函数connect,传入Server端的ip和port作为参数,这样就会让Client端的协议栈自动发送SYN报文,收到Server端的ACK+SYN报文后,也会自动回复ACK,完成三次握手

自定义组装报文完成TCP连接

有的时候我们想用CANoe模拟一个Server服务器,并不想自动完成三次握手,想手动完成三次握手。那么我们就不应该创建一个Server端socket调用accept函数,应该通过在on ethernetpacket里接收到SYN报文后,通过回复SYN+ACK的方式,完成握手

on ehternetpacket里接收到的报文是网卡上的报文,也就是说在二层就被接收了。我就可以在这里模拟握手连接,而不需要跑到传输层上面的socket那进行握手连接

这样的好处是更灵活,当然也更麻烦


TCP Socket在客户端和服务器中是如何建立连接的TCP Socket在客户端和服务器中是如何建立连接的TCP Socket在客户端和服务器中是如何建立连接的TCP Socket在客户端和服务器中是如何建立连接的

原文始发于微信公众号(汽车网络诊断通信):TCP Socket在客户端和服务器中是如何建立连接的

版权声明:admin 发表于 2022年1月18日 上午10:07。
转载请注明:TCP Socket在客户端和服务器中是如何建立连接的 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...