socket通信原理-TCP

  • Post author:
  • Post category:其他




什么是socket

socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信。

在这里插入图片描述



socket如何实现通信

在这里插入图片描述



第一次握手:

客户端

A.调用socket()函数,创建socket描述符

int socket(int domain, int type, int protocol);

domain指明所使用的协议族,通常为PF_INET,表示互联网协议族(TCP/IP协议族);type参数指定socket的类型:SOCK_STREAM 或SOCK_DGRAM,Socket接口还定义了原始Socket(SOCK_RAW),允许程序使用低层协议;protocol通常赋值”0″。

B.调用connect()函数,触发了连接请求,向服务器发送了SYN J包,这时connect进入阻塞状态

服务器端

A.监听到连接请求,即收到SYN J包

B.调用socket()函数,创建socket描述符

C.调用bind()函数,把一个地址族中的特定地址赋给socket

D.调用listen()函数,将套接字用于监听进入的连接

原型:int listen(int sockfd, int backlog);

参数

sockfd:socket函数返回的套接字

backlog:已完成三次握手的最大连接个数

返回值:成功返回0,失败返回-1

一般来说,listen函数应该在调用socket和bind函数之后,调用函数accept之前调用。

对于给定的监听套接口,内核要维护两个队列:

1、已由客户发出并到达服务器,服务器正在等待完成相应的TCP三路握手过程

2、已完成连接的队列

E.调用accept函数接收请求向客户端发送SYN K ,ACK J+1,这时accept进入阻塞状态;

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

accept函数的第一个参数为服务器的socket描述字,第二个参数为指向struct sockaddr *的指针,用于返回客户端的协议地址,第三个参数为协议地址的长度。

注意:accept的第一个参数为服务器的socket描述字,是服务器开始调用socket()函数生成的,称为监听socket描述字;而accept函数返回的是已连接的socket描述字。一个服务器通常通常仅仅只创建一个监听socket描述字,它在该服务器的生命周期内一直存在。内核为每个由服务器进程接受的客户连接创建了一个已连接socket描述字,当服务器完成了对某个客户的服务,相应的已连接socket描述字就被关闭。



第二次握手

客户端收到服务器的SYN K ,ACK J+1之后,这时connect返回,并对SYN K进行确认。



第三次握手

服务器收到ACK K+1时,accept返回

如果accpet成功,那么其返回值是由内核自动生成的一个全新的描述字,代表与返回客户的TCP连接。



socket连接与HTTP连接区别



socket连接

1.socket是位于应用层和传输层之间的“抽象层”

2.socket连接其实就是tcp连接,因为tcp是全双工的,所以Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开,因此socket连接是有状态的



HTTP连接

1.HTTP协议是应用层协议

2.HTTP连接是无状态的

HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接(其实还是建立的TCP 连接)。从建立连接到关闭连接的过程称为“一次连接”。

1)在HTTP 1.0中,客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接。

2)在HTTP 1.1中则可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。

由 于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种“短连接”,要保持客户端程序的在线状态,需要不断地向服务器发起连接请求。通常的 做法是即时不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道客 户端“在线”。若服务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开。



应用

由于HTTP的无状态性等,常用于OA系统等应用

由于socket通信的及时性等,常用于群聊、支付、银行交互等场景



版权声明:本文为m0_48270515原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。