소켓이란 무엇인가요?
Socket은 애플리케이션 계층과 전송 계층 사이의 추상화 계층으로, TCP/IP 계층의 복잡한 작업을 여러 간단한 인터페이스로 추상화하여 네트워크에서 프로세스 통신을 구현하기 위해 애플리케이션 계층에서 호출할 수 있습니다. 소켓은 모든 것이 파일이라는 UNIX 개념에서 파일 디스크립터라고 합니다. 소켓은 "열기-읽기/쓰기-닫기" 모드를 구현한 것입니다. 각 클라이언트는 "파일"을 유지합니다. ". 연결이 설정되고 열린 후 파일에 내용을 써서 상대방이 읽거나 상대방의 내용을 읽을 수 있습니다. 통신이 끝나면 파일이 닫힙니다.
그림은 소켓의 위치를 보여줍니다:
소켓 통신 프로세스
소켓은 서로 다른 컴퓨터 간의 통신, 즉 네트워크 통신을 보장합니다. 웹사이트의 경우 통신 모델은 서버와 클라이언트 간의 통신입니다. 양쪽 끝에 Socket 객체가 생성되고, Socket 객체를 통해 데이터가 전송된다. 일반적으로 서버는 클라이언트가 연결되기를 기다리는 무한 루프 상태에 있습니다.
관련 학습 비디오 튜토리얼 공유: php 비디오 튜토리얼
다음 그림은 연결 지향 TCP 타이밍 다이어그램입니다:
클라이언트 프로세스:
클라이언트 프로세스는 상대적으로 간단합니다. 소켓을 생성하고, 서버에 연결, 소켓을 원격 호스트에 연결(참고: TCP에만 "연결" 개념이 있고 UDP, ICMP 및 ARP와 같은 일부 소켓에는 "연결" 개념이 없음), 데이터 보내기, 읽기 응답 데이터는 데이터 교환이 완료될 때까지 연결을 닫고 TCP 대화를 종료합니다.
send() 메서드도 여기에서 사용할 수 있습니다. 차이점은 sendall()이 반환하기 전에 모든 데이터 전송을 시도하고 성공하면 None을 반환하는 반면, send()는 전송된 바이트 수를 반환하고 오류를 발생시킨다는 것입니다. 비정상적으로 실패했을 때.
서버 측 프로세스:
서버 측 프로세스에 대해 이야기해 보겠습니다. 서버는 먼저 소켓을 초기화하고 스트리밍 소켓을 설정하고 이를 로컬 주소와 포트에 바인딩한 다음 TCP에 준비가 되었음을 알립니다. 연결을 수신합니다. 클라이언트로부터의 연결을 차단하고 기다리려면 accept()를 호출합니다. 이때 클라이언트가 서버와 연결을 설정하면 클라이언트는 데이터 요청을 보내고 서버는 요청을 받아 처리한 후 응답 데이터를 클라이언트로 보내고 클라이언트는 데이터 교환이 완료될 때까지 데이터를 읽습니다. 완료되었습니다. 마지막으로 연결이 닫히고 상호작용이 종료됩니다.
accept()가 호출되면 소켓은 대기 상태로 들어갑니다. 클라이언트가 연결을 요청하면 메서드는 연결을 설정하고 서버로 반환합니다. accept()는 두 요소(conn, addr)가 있는 튜플을 반환합니다. 첫 번째 요소 conn은 서버가 클라이언트와 통신해야 하는 새 Socket 개체입니다. 두 번째 요소 addr은 클라이언트의 IP 주소 및 포트입니다. data = conn.recv(1024)
다음 단계는 서버와 클라이언트가 send() 및 recv()를 통해 통신(데이터 전송)하는 처리 단계입니다.
서버는 send()를 호출하고 문자열 형식으로 정보를 클라이언트에 보냅니다. send()는 보낸 문자 수를 반환합니다.
서버는 클라이언트로부터 정보를 받기 위해 recv()를 호출합니다. recv() 를 호출할 때 서버는 이 메서드 호출로 수신할 수 있는 최대 데이터 양에 해당하는 정수를 지정해야 합니다. recv()는 데이터를 수신할 때 차단 상태에 들어가고, 마지막으로 수신된 데이터를 나타내는 문자열을 반환합니다. 전송된 데이터의 양이 recv()가 허용하는 양을 초과하면 데이터가 잘립니다. 초과 데이터는 수신 측에서 버퍼링됩니다. 나중에 recv()가 호출되면 나머지 바이트를 계속 읽습니다. 초과 데이터가 있으면 버퍼에서 삭제됩니다(클라이언트도 마찬가지). 마지막 recv() 호출 이후 전송된 데이터). 전송이 완료되면 서버는 Socket의 close()를 호출하여 연결을 종료합니다.
TCP 연결 관점에서 소켓 프로세스 살펴보기:
TCP three-way handshake 소켓 프로세스:
1. 서버는 초기화를 완료하기 위해 소켓(), 바인딩() 및 청취()를 호출한 후 차단하고 대기하기 위해 accept()를 호출합니다.
2 클라이언트 소켓 객체는 SYN을 보내기 위해 호출합니다.
3. 서버는 첫 번째 핸드셰이크를 완료합니다. 즉, SYN 및 ACK 응답을 보냅니다.
4. 서버로부터 응답을 받은 후 클라이언트는 connect()에서 반환되어 ACK를 보냅니다.
5. 서버 소켓 개체는 이때 클라이언트의 세 번째 핸드셰이크 ACK 확인을 수신하여 연결을 설정합니다.
다음 단계는 양쪽 끝의 연결 개체가 서로 데이터를 보내고 받는 것입니다.
4개 웨이브의 TCP 소켓 프로세스:
1. 애플리케이션 프로세스는 close()를 호출하여 FIN을 적극적으로 닫고
2를 보냅니다.
3. 그런 다음 종료를 수동적으로 실행하는 애플리케이션 프로세스는 close()를 호출하여 소켓을 닫고 FIN도 보냅니다.
4. FIN을 수신한 쪽은 ACK를 다른 쪽으로 보냅니다.
요약:
위 코드는 단순히 소켓의 기본 기능을 사용하는 방법을 보여줍니다. 실제로 네트워크 프로그램이 아무리 복잡하더라도 이러한 기본 기능이 사용됩니다. 위의 서버 코드는 다음 클라이언트 요청을 처리하기 전에 하나의 클라이언트 요청만 처리합니다. 이러한 서버는 처리 기능이 매우 약합니다. 실제로 서버는 동시 처리 기능을 갖추어야 합니다. 새로운 프로세스나 스레드가 요청을 처리합니다.
추천 관련 기사 및 튜토리얼: php 튜토리얼
위 내용은 PHP 소켓을 이해하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!