TCP 세 방향 핸드 셰이크와 손을 흔들었다 짧게 네 번

TCP는 전송 제어 프로토콜 (영어 : TCP로 축약 전송 제어 프로토콜)는 IETF RFC 793에 의해 정의 된 바이트 스트림에 기반 연결 지향, 신뢰할 수있는 전송 계층 프로토콜입니다.

TCP

TCP 통신, 연결, 데이터 전송을 만들 통과 연결 세 단계를 종료합니다.

TCP는 연결 지향 통신 및 신뢰할 수 있습니다. 통신은 양측이 공식적으로, 특정 시스템 커널 자원의 하나 하나에 안정적인 연결 및 배포 통신이를 통해 데이터 연결을 두 번하기 전에 설정해야하며, 통신 트윈 엔진 후 종료 할 때 시스템 리소스를 확보하기 위해 분리해야합니다.

TCP는 응답 메커니즘을 보내는 데 사용하는, 각각의 성공적인 전송은 전송 및 응답에 따라 달라집니다. 응답이 특정 시간에 수신되지 않으면, 그것은 다시 발행됩니다. 그리고 패킷 손실에, 각 패킷은 시퀀스 번호를 가지며, 또한 일련 번호를 순차적으로 패킷 수신 엔티티의 수신 측에 전송되는 것을 보장한다.

TCP 클라이언트 구현 코드 :

from socket import *

# 创建socket
tcp_client_socket = socket(AF_INET, SOCK_STREAM)

# 目的信息
server_ip = input("请输入服务器ip:")
server_port = int(input("请输入服务器port:"))

# 链接服务器
tcp_client_socket.connect((server_ip, server_port))

# 提示用户输入数据
send_data = input("请输入要发送的数据:")

tcp_client_socket.send(send_data.encode("gbk"))

# 接收对方发送过来的数据,最大接收1024个字节
recvData = tcp_client_socket.recv(1024)
print('接收到的数据为:', recvData.decode('gbk'))

# 关闭套接字
tcp_client_socket.close()
复制代码

TCP 서비스 측 코드 :

from socket import *

# 创建socket
tcp_server_socket = socket(AF_INET, SOCK_STREAM)

# 本地信息
address = ('', 7890)

# 绑定
tcp_server_socket.bind(address)

# 使用socket创建的套接字默认的属性是主动的,使用listen将其变为被动的,这样就可以接收别人的链接了
tcp_server_socket.listen(128)

# 如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务
# client_socket用来为这个客户端服务
# tcp_server_socket就可以省下来专门等待其他新客户端的链接
client_socket, clientAddr = tcp_server_socket.accept()

# 接收对方发送过来的数据
recv_data = client_socket.recv(1024)  # 接收1024个字节
print('接收到的数据为:', recv_data.decode('gbk'))

# 发送一些数据到客户端
client_socket.send("thank you !".encode('gbk'))

# 关闭为这个客户端服务的套接字,只要关闭了,就意味着为不能再为这个客户端服务了,如果还需要服务,只能再次重新连接
client_socket.close()
复制代码

TCP 세 방향 핸드 셰이크

클라이언트가 서버의 통신을 유지하면 때 세 방향 핸드 셰이크를 준비 자원이 될 것입니다.

이하와 SYN ACK 요청 (SYN)과 응답 (ACK)을 구별한다. J는 K 랜덤 만 식별 아닌 실제 송신 J, K.를 나타낸다

  1. 첫 번째 클라이언트는 임의의 표지 SYN J.하여 서버에 데이터 패킷 요청을 보내고 전면 SYN에 마커 응답을 추가합니다.

  2. 서비스가 종료 된 후, revc는-막힘을 해제하고, 데이터를 송수신 할 수있는 새로운 소켓을 할당합니다. TCP는 서버가 클라이언트로 전송되는 임의 마크 플러스 J + 1을 통해 클라이언트를 보낼 수 있도록 각 요청, 응답이 있어야합니다 필요하기 때문에이 준비 리소스를 가지고있는 서버를 알려줍니다. 이전 ACK에서 마커 응답을 추가합니다.

  3. 이 때, 서버는 클라이언트가 신뢰할 수, 클라이언트는 자원을 준비해야하기 때문에 서버가 클라이언트에 임의의 표지 (SYN K)과 같은 패킷을 전송하는지 확인해야합니다.

  4. 서버가 클라이언트 패킷을 서버로 확인 메시지를 전송 패킷 수신하면, 서버는 서버로 전송 플러스 K (ACK K + 1)에 걸쳐 전송한다.

서버 응답 서버는 클라이언트가 클라이언트에 송신하도록 결정하고, 머리없이 지연 또는 중간, 패킷에 접속 된 클라이언트에 단지 각 클라이언트 서버에 송신되는 확인 응답 패킷 서비스 클라이언트가 없기 때문에 가. 두 단계를 한 단계로 결합, 이렇게 세 방향 핸드 셰이크했다.

이 세 방향 핸드 셰이크 그들이 신뢰할 수 있는지 확인합니다 당사자 완료되면, 그들은 통신 할 수 있습니다.

TCP 넷 개 웨이브

순서대로 모두 클라이언트와 서버 통신의 끝, 시스템 자원의 석방을 보장하는 경우, 양측은 4 차, 자원의 석방을 분리해야합니다. 소켓 소켓 전이중이므로 소켓은 두 송신 필요성 및 채널을 수신 할 때 폐쇄 될 때, 즉, 송수신기가 동시에 수행 될 수 있고, 따라서.

임의의 마크로서 전송되는 동일한 세 방향 핸드 셰이크로 데이터 패킷을 전송, 응답시의 동작에 추가 될 수있다.

  1. 클라이언트 호출이 소켓 연결이 서버에 패킷을 전송 닫혀 닫을 때 일반적으로 먼저 클라이언트에 의해 시작 분리합니다.

  2. 그것은, 패킷 최종 고객에게 돌아갑니다 클라이언트의 영수증 연결 요청을 닫 확인하는 경우 서버는 클라이언트 패킷을 수신.

  3. 탈 막힘의 RECV 서비스 측, 클라이언트가 서버 시간의 마지막에 호출을 보낼 때 클라이언트 소켓이 종료됩니다 알리기 위해 패킷을 전송 줄 것이다. 당신이 확인 패킷 클라이언트를받을 때까지 그러나이 시간은 서버 리소스가 유지됩니다.

  4. 클라이언트는 서버가 확인 응답 패킷을 전송 제공하는 패킷을 수신 할 때, 클라이언트 자원이 일정 기간 동안 유지 될 것이다.

정상적인 상황에서는 클라이언트와 서버함으로써 트랜시버의 두 채널의 소켓을 닫는 두 번 응답을 받게됩니다.

서버 자원 예약 때문에 클라이언트에서 응답을받지 못한 전송 서버의 TCP 패킷이 다음 패킷이 다시 클라이언트로 전송하면 시간 제한. 또한 클라이언트 자원 예약 시간 때문에 서버는 다시 통해 전송 데이터에 다시 패킷을 수신하지 않는, 그래서 그들은받을 필요합니다. 종료 요청 클라이언트에 의해 시작되면 자원을 해제 할 수있는 소켓을 닫습니다 오래된 경우, 클라이언트의 자원은 일반적으로 서비스 종료 재전송 패킷을 수신 확률을 증가 2MSL 두 개의 데이터 패킷을 받아들이는 시간이다 소유.

네 개의 클라이언트에 대한 클라이언트의 응답으로 전송 서버에서 요청을 흔들었다 및 승인 패킷 오프, 서버가 가까운시기는 불확실 호출을 함께하기 때문에 악수로 가까운 세 방향을 좋아하지 전송하고 클라이언트 경우 먼저 클라이언트가 두 배의 데이터 패킷 전송을 기다리는 가까이, 너무 오래 시작했다. 발표 자료를 다시 제공 할 수없는 서버는 포트를 바인딩, 클라이언트는 임의의 포트는 이러한 제한의 영향을받지 않습니다이다.

개요

세 가지를 통해 TCP 핸드 쉐이크 처음 준비 자료를 통해 통신 할 때, 다음 통신합니다. 일차 반응에 대응하는 각각의 요청을 백업하는 통신 방법이있다. 통신의 끝은 네 밀접한 관계, 무료 시스템 리소스를 통해 손을 흔들었다됩니다합니다.

추천

출처blog.csdn.net/weixin_33692284/article/details/91376945