>  기사  >  php教程  >  소켓에 대한 간단한 이해

소켓에 대한 간단한 이해

高洛峰
高洛峰원래의
2016-12-13 09:53:011222검색

소켓에 대한 간단한 이해

소켓을 이해하려면 먼저 소켓에 대한 간단한 이해 프로토콜 계열을 숙지해야 합니다. 소켓에 대한 간단한 이해(전송 제어 프로토콜/인터넷 프로토콜)는 전송 제어 프로토콜/인터넷 프로토콜입니다. 호스트가 어떻게 인터넷에 연결하고 그 사이에 데이터가 어떻게 전송되는지에 대한 표준을 정의합니다.

소켓에 대한 간단한 이해는 말 그대로 TCP와 IP 프로토콜의 총칭이지만 실제로는 소켓에 대한 간단한 이해입니다. 프로토콜은 인터넷 IP 프로토콜 계열의 전체 소켓에 대한 간단한 이해 프로토콜을 나타냅니다. ISO 모델의 7개 계층과 달리 소켓에 대한 간단한 이해 프로토콜 참조 모델은 모든 소켓에 대한 간단한 이해 시리즈 프로토콜을 4개의 추상 계층

애플리케이션 계층: TFTP, HTTP, SNMP, FTP, SMTP, DNS, Telnet으로 분류합니다. 등

전송 계층: TCP, UDP

네트워크 계층: IP, ICMP, OSPF, EIGRP, IGMP

데이터 링크 계층: SLIP, CSLIP , PPP, MTU

각 추상화 계층은 하위 계층에서 제공하는 서비스를 기반으로 구축되어 상위 계층에 서비스를 제공합니다.

소켓에 대한 간단한 이해

소켓에 대한 간단한 이해

이 글을 읽고 관심을 갖고 있는 학생들은 이에 대해 어느 정도 이해하고 있을 것으로 추정됩니다. 또한, 저도 약간의 지식을 갖고 있기 때문에 자세한 설명은 생략하겠습니다. 관심 있는 학생들은 온라인에서 정보를 검색해 보세요.

소켓에 대한 간단한 이해 프로토콜에서는 두 개의 인터넷 호스트가 두 개의 라우터와 해당 레이어를 통해 연결됩니다. 각 호스트의 애플리케이션은 일부 데이터 채널

소켓에 대한 간단한 이해协议

소켓

을 통해 서로 읽기 작업을 수행합니다. 로컬 프로세스 통신에서는 PID를 사용하여 프로세스를 고유하게 식별할 수 있지만 PID는 로컬에서만 고유합니다. 이때 네트워크의 두 프로세스 간에 PID 충돌이 발생할 가능성이 매우 높습니다. 이제 우리는 IP 계층의 IP 주소가 호스트를 고유하게 식별할 수 있고, TCP 계층 프로토콜과 포트 번호가 호스트의 프로세스를 고유하게 식별할 수 있다는 것을 알고 있습니다. 프로토콜 + 포트 번호는 네트워크에서 프로세스를 고유하게 식별합니다.

네트워크에서 프로세스를 고유하게 식별할 수 있게 되면 소켓을 사용하여 통신할 수 있습니다. 우리는 종종 소켓을 소켓으로 번역합니다. 소켓은 애플리케이션 계층과 전송 계층 사이의 추상화 계층입니다. 이는 소켓에 대한 간단한 이해 계층의 복잡한 작업을 애플리케이션 계층이 네트워크에서 구현된 프로세스를 호출할 수 있도록 몇 가지 간단한 인터페이스로 추상화합니다. 연락.

소켓에 대한 간단한 이해

모든 것이 파일이라는 Unix 철학에 따라 소켓은 "열기-읽기/쓰기-닫기" 서버 및 클라이언트 모드를 구현합니다. 각 클라이언트는 "파일"을 유지 관리합니다. 연결이 설정되고 열린 후 상대방이 상대방의 콘텐츠를 읽거나 읽을 수 있도록 자체 파일에 콘텐츠를 쓸 수 있습니다. 통신이 끝나면 파일이 닫힙니다.

소켓 통신 프로세스

소켓은 "열기-읽기/쓰기-닫기" 모드를 구현한 것입니다. TCP 프로토콜 통신을 사용하는 소켓을 예로 들면 상호 작용 프로세스는 대략 다음과 같습니다. this

소켓에 대한 간단한 이해

서버는 주소 유형(ipv4, ipv6), 소켓 유형 및 프로토콜을 기반으로 소켓을 생성합니다

서버는 IP 주소를 바인딩하고 포트 번호를 소켓으로

서버 소켓은 포트 번호 요청을 수신하고 언제든지 클라이언트로부터 연결을 받을 준비가 되어 있습니다. 이 때 서버의 소켓은 열리지 않습니다

클라이언트. 소켓을 생성합니다

클라이언트가 소켓을 열고 서버에 따라 IP 주소와 포트 번호가 서버 소켓에 연결을 시도합니다.

서버 소켓이 클라이언트 소켓 요청을 받아 수동적으로 엽니다. , 클라이언트가 연결 정보를 반환할 때까지 클라이언트 요청 수신을 시작합니다. 이때 소켓이 차단 상태에 들어간다는 것은 클라이언트가 연결 정보를 반환하고 다음 클라이언트 이해 요청을 받기 시작할 때까지 accept() 메서드가 반환되지 않는다는 것을 의미합니다.

클라이언트 성공적으로 연결되고 연결 상태 정보를 서버로 보냅니다.

서버 승인 메서드가 반환되고 연결이 성공합니다.

클라이언트가 소켓에 정보를 씁니다

서버가 읽습니다. 정보

클라이언트가 닫힙니다

서버 측 종료

3방향 핸드셰이크

소켓에 대한 간단한 이해 프로토콜에서 TCP 프로토콜은 3방향 핸드셰이크를 통해 안정적인 연결을 설정합니다.

소켓에 대한 간단한 이해

첫 번째 핸드셰이크: 클라이언트 서버에 연결을 시도하고 서버에 syn 패킷을 보내려고 합니다(시퀀스 번호 동기화), syn=j, 클라이언트는 SYN_SEND 상태에 진입하고 서버가 확인하기를 기다립니다.

두 번째 핸드셰이크: 서버 클라이언트의 syn 패킷을 수신하고 확인(ack=j+1)함과 동시에 SYN 패킷(syn=k), 즉 SYN+ACK 패킷을 클라이언트에 전송합니다. 이때 서버는 SYN_RECV 상태

세 번째 핸드셰이크: 세 번째 핸드셰이크: 클라이언트 클라이언트는 서버로부터 SYN+ACK 패킷을 수신하고 확인 패킷 ACK(ack=k+1)를 서버로 보냅니다. 패킷이 전송된 후 클라이언트와 클라이언트는 서버가 ESTABLISHED 상태에 진입하고 3방향 핸드셰이크를 완료합니다

자세히 살펴보면 서버 소켓과 클라이언트 소켓 사이의 연결을 설정하는 부분이 실제로 유명한 3방향 핸드셰이크입니다

 소켓에 대한 간단한 이해编程API

소켓 프로그래밍 API

앞서 언급했듯이 소켓은 "open-read/"write-close" 모드를 구현하기 위해 API 소켓이 애플리케이션에 어떤 기능을 제공하는지 간단히 알아보겠습니다. TCP 프로토콜을 예로 들어 Unix의 소켓 API를 살펴보겠습니다. 다른 언어도 매우 유사합니다(PHP도 이름도 거의 동일합니다). 구체적인 용도에 관심이 있는 학생들은 블로그 참고 링크를 확인하거나 온라인

int 소켓(int 도메인, int 유형, int 프로토콜);


지정된 주소 계열, 데이터 유형 및 프로토콜을 기반으로 소켓 설명자와 그것이 사용하는 리소스를 할당합니다.

도메인: 프로토콜 계열, 일반적으로 사용되는 프로토콜은 AF_INET, AF_INET6, AF_LOCAL, AF_ROUTE입니다. 여기서 AF_INET은 ipv4 주소 사용을 나타냅니다.

유형: 소켓 유형, 일반적으로 사용되는 소켓 유형에는 SOCK_STREAM, SOCK_DGRAM, SOCK_RAW, SOCK_PACKET, SOCK_SEQPACKET 등

프로토콜: 프로토콜. 일반적으로 사용되는 프로토콜에는 IPPROTO_TCP, IPPTOTO_UDP, IPPROTO_SCTP, IPPROTO_TIPC 등이 포함됩니다.

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


주소 패밀리 입력 특정 주소는 소켓에 할당됩니다

sockfd:소켓에 대한 간단한 이해 설명자, 즉 소켓 참조

addr: sockfd에 바인딩할 프로토콜 주소

addrlen: 길이 주소

일반적으로 서버는 서비스 제공을 시작할 때 잘 알려진 주소(예: IP 주소 + 포트 번호)에 바인딩되며 고객은 이를 통해 서버에 연결할 수 있습니다. 이를 지정할 필요가 없으면 시스템이 자동으로 포트 번호와 IP 주소 조합을 할당합니다. 이것이 서버가 일반적으로 수신 대기 전에 바인딩()을 호출하지만 클라이언트는 이를 호출하지 않는 대신 시스템이 연결()할 때 임의로 생성하는 이유입니다.

int listening(int sockfd, int backlog);


Listening 소켓

sockfd:

backlog를 수신하기 위한 소켓 설명자: 해당 소켓이 대기열에 넣을 수 있는 최대 연결 수

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


소켓에 연결

sockfd : 클라이언트의 소켓 설명자

addr: 서버의 소켓 주소

addrlen: 소켓 주소의 길이

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen ; End 소켓 주소


addrlen: 소켓 주소의 길이

ssize_t read(int fd, void *buf, size_t count);

소켓 내용 읽기

fd: 소켓 설명자

buf: 버퍼


count: 버퍼 길이

ssize_t write(int fd, const void *buf, size_t count) ;

소켓에 콘텐츠를 쓰는 것은 실제로 콘텐츠를 보내는 것입니다

fd: 소켓 설명자

buf: 버퍼


count: 버퍼 영역 길이

int close(int fd);

소켓이 닫힌 것으로 표시되어 해당 소켓 설명자의 참조 횟수가 -1이 되면 TCP 클라이언트가 트리거됩니다. 서버에 종료 요청을 보냅니다.

참고

Linux 소켓 프로그래밍(Linux에만 국한되지 않음)


소켓 프로그래밍 알아보기

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.