실전 | 서버 개발과 컴퓨터 네트워크를 결합한 완벽한 사례

머리말

안녕하세요 여러분 마틴입니다

백엔드는 알고리즘 다음으로 가장 경쟁이 치열한 포지션이라고 할 수 있고, 서버사이드 개발 역시 많은 분들이 가을 채용 때 제출하는 포지션으로 많은 분들이 서비스 경력을 시작하시는 것 같아요. 클라이언트 개발의 출발점은 에코 서버입니다.

오늘은 서버 측의 기본 데이터 교환의 모든 부분을 실제로 경험할 수 있는 실습 경험을 제공하겠습니다.이 과정에서 TCP의 3방향 핸드셰이크와 4방향 웨이브의 구체적인 프로세스를 볼 수 있습니다. 과정은 유익하고 농담이 아닙니다 .

그림

환경 도구

클라이언트: Ubuntu 16.04, IP: 192.168.78.128, 클라이언트 A라고 함

서버: Ubuntu 16.04, IP: 192.168.78.130, 서버 B라고 함

패킷 캡처 도구 - Linux의 Wireshark 및 패킷 캡처 명령 tcpdump

GCC:5.4.0

Wireshark의 아이콘이 큰 상어의 지느러미를 닮았다고 해서 대백상어라고도 불립니다. 못 믿겠다면 한 번 보세요.

그림

백상어

세 번의 악수와 네 번의 손짓

다음은 TCP의 가장 고전적인 3방향 핸드셰이크와 4방향 웨이브에 대한 간략한 소개입니다.

그림

세 번의 악수, 네 번의 손짓

세 번의 악수
  1. 첫 번째 핸드셰이크: 연결을 설정합니다. 클라이언트는 SYN 비트를 1로, seq(Sequence Number)를 x로 설정하여 연결 요청 세그먼트를 보낸 후 SYN_SEND 상태로 들어가 서버의 확인을 기다립니다.

  2. 두 번째 핸드셰이크: 서버가 SYN 세그먼트를 수신합니다. 서버가 클라이언트로부터 SYN 메시지 세그먼트를 수신하면 SYN 메시지 세그먼트를 확인하고 ack(승인 번호)를 x+1(즉, seq+1)로 설정해야 합니다. SYN 요청 정보를 SYN 위치가 1, seq가 y로 보내면 서버는 위의 모든 정보를 메시지 세그먼트(즉, SYN+ACK 메시지 세그먼트)에 담아 클라이언트에게 함께 보낸다. 서버가 SYN_RECV 상태에 들어갑니다.

  3. 세 번째 핸드셰이크: 클라이언트는 서버로부터 SYN+ACK 메시지 세그먼트를 받습니다. 그런 다음 ack를 y+1로 설정하고 ACK 메시지 세그먼트를 서버로 보냅니다. 메시지 세그먼트가 전송된 후 클라이언트와 서버 모두 ESTABLISHED 상태에 진입하고 TCP 3방향 핸드셰이크를 완료합니다.

데이터 상호작용

연결이 성공적으로 설정된 후 클라이언트와 서버는 데이터 교환을 시작합니다. 클라이언트가 데이터를 보내고, 서버가 데이터 수신으로 응답한 후 교대로 진행합니다.

네 번 흔들다

안정적인 데이터 전송을 위해 클라이언트와 서버가 3방향 핸드셰이크를 통해 TCP 연결을 설정하고, 데이터 전송이 완료되면 TCP 연결을 끊어야 하는데, 여기에 신비한 '4파도'가 있다.

  1. 첫 번째 물결: 클라이언트는 seq와 ack를 설정하고 FIN 세그먼트를 서버에 보냅니다. 이때 클라이언트는 FIN_WAIT_1 상태에 진입합니다. 이는 클라이언트가 서버에 보낼 데이터가 없음을 의미합니다.

  2. 두 번째 웨이브: 서버는 클라이언트가 보낸 FIN 세그먼트를 수신하고 ACK 세그먼트를 클라이언트에 반환합니다. ack는 seq+1이고 클라이언트는 FIN_WAIT_2 상태에 진입합니다. 서버는 클라이언트에게 내가 귀하의 의견에 "동의"한다고 알립니다. 폐쇄 요청;

  3. 세 번째 물결: 서버가 클라이언트에 FIN 세그먼트를 보내 연결 종료를 요청하는 동시에 서버는 LAST_ACK 상태로 들어갑니다.

  4. 네 번째 물결: 클라이언트는 서버가 보낸 FIN 세그먼트를 수신하고 ACK 세그먼트를 서버에 보낸 다음 클라이언트는 TIME_WAIT 상태에 진입합니다. 서버는 클라이언트로부터 ACK 세그먼트를 수신한 후 연결을 닫습니다. 이때 클라이언트가 2MSL을 기다린 후에도 여전히 응답을 받지 못한다면 이는 서버가 정상적으로 종료되었음을 의미하며, 클라이언트도 연결을 닫을 수 있습니다.

아이디어 정리

여기서는 Yin Shengyu [Han]의 저서 "TCP/IP 네트워크 프로그래밍" 4장에 있는 간단한 버전의 에코 서버를 주로 실험에 사용했습니다.

일명 에코 서버는 어릴 때 에코밸리에서 했던 게임과 똑같습니다. 계곡에서 '아' 소리를 지르면 계곡에서 '아' 소리가 납니다. 에코 서버는 사용자가 서버에 "hello world"를 보내고, 에코 서버도 사용자에게 "hello world"를 응답한다는 의미입니다.

1. 클라이언트 프로그램 echo_client.c를 클라이언트 A에 배치하고, 서버 프로그램 echo_server.c를 서버 B에 배치합니다.

2. 클라이언트 A에서 명령줄 창을 열고, tcpdump 명령을 사용하여 A와 B 간의 네트워크 통신을 모니터링하고, 메시지를 pacp 파일로 저장하여 후속 패킷 캡처 분석을 용이하게 합니다.

3. 서버 B에서 echo_server.c 프로그램을 컴파일하고 서버 프로그램 echo_server를 시작한 다음 지정된 포트 2333을 수신합니다.

여기서 포트 번호는 사용자가 직접 지정할 수 있으며 1025-65535 사이일 수 있습니다. 주로 http의 포트 80 및 SSH의 포트 22와 같이 시스템이 0-1024를 차지했기 때문입니다. Linux에서 기본 포트 수는 65535이므로 지정할 수 있는 포트 번호는 1025-65535입니다.

4. 클라이언트 A에서 echo_client.c 프로그램을 컴파일하고 클라이언트 프로그램 echo_client를 열고 호출 IP와 포트 번호를 지정합니다. 여기서는 서버 B의 IP: 192.168.78.130 및 2333 포트 번호입니다.

5. 클라이언트 A에서 "hello" 메시지를 보낸 다음 Q를 눌러 종료합니다.

6. 통신이 완료된 후 2에서 저장한 파일을 Windows 환경으로 전송하고 Wireshark를 이용하여 네트워크 데이터 패킷을 분석한다.

7. 캡처된 데이터 패킷 파일을 분석합니다.

건조 시작

너무 많은 말을 했으니 이제 시작할 시간입니다!

1. echo_client.c 및 echo_server.c를 각각 클라이언트 A:192.168.78.128 및 서버 B:192.168.78.130에 배치합니다.

그림

클라이언트 A

그림

서버 B

2. 클라이언트 A에서 새 명령줄 창을 열고 sudo tcpdump -i any tcp 및 호스트 192.168.78.130 및 포트 2333 -w message.pcap 명령을 입력합니다.

1. tcpdump 명령에는 관리자 권한이 필요하므로 관리자 권한을 얻기 위해서는 sudo 명령을 추가해야 합니다.

2. 이 명령의 일반적인 의미는 포트 번호 2333에서 클라이언트 A:192.168.78.128과 서버 B:192.168.78.130 사이의 TCP 기반 데이터 교환을 모니터링하고 이를 message.pcap 파일로 저장하는 것입니다.

그림

tcpd 패킷 저장 명령

보시다시피 이 명령을 입력한 후 먼저 Linux에서 비밀번호를 입력하여 관리자 권한을 얻은 다음 포트 번호 2333 TCP 통신에서 클라이언트 A: 192.168.78.128 및 서버 B: 192.168.78.130 모니터링을 시작해야 합니다. .

3. 다음으로 echo_server.c가 들어있는 폴더에 들어가서 B서버의 프로그램을 컴파일해 보겠습니다. 컴파일 명령어는 gcc echo_server.c -o echo_server 인데 현재 폴더에 echo_server 프로그램이 나타나는 것을 볼 수 있습니다.

그림

서버 프로그램 컴파일

다음으로 미리 설정한 포트 번호 2333을 청취하기 시작합니다. 명령은 ./echo_server 2333입니다. 서버가 공식적으로 청취를 시작합니다.

그림

서버 프로그램 실행

4. 서버 B를 설정한 후 클라이언트 A로 이동하기 시작합니다. 2에서 tcpdump 명령으로 모니터링되는 포트 번호를 닫지 마십시오. 닫지 마십시오. 클라이언트 A에서 새 명령줄을 엽니다.

서버 B와 유사하게 먼저 클라이언트 A에서 echo_client.c 프로그램을 컴파일합니다. 컴파일 명령은 다음과 같습니다: gcc echo_client.c -o echo_client

그림

클라이언트 프로그램 컴파일

서버 B와 마찬가지로 클라이언트 A에서 클라이언트 프로그램 echo_client를 열고 호출 IP: 192.168.78.130 및 포트 번호 2333을 지정합니다.

명령은 ./echo_client 192.168.78.130 2333입니다.

그림

클라이언트 프로그램 실행

"Connected..."라는 글자가 나타나는 것을 볼 수 있는데, 이는 우리가 25,000km의 대장정을 마치고 성공적으로 재결합했음을 의미합니다!

클라이언트 A와 서버 B가 드디어 성공적으로 연결되었습니다.이번에는 서버 B의 상태를 살펴보겠습니다.

그림

서버 프로그램 상태

서버 B의 청취 창에도 "Connect client 1"이라는 단어가 나타납니다. 즉, 서버 입장에서 보면 클라이언트가 성공적으로 연결을 설정한 것입니다.

5. 다음 단계는 통신을 시작하는 것입니다. 클라이언트 A에게 "hello"라는 단어를 보냅니다.

그림

클라이언트 A에서 메시지 보내기

보시다시피, 우리는 클라이언트 A에 "hello" 메시지를 보냈고, 서버 B도 우리에게 "hello" 메시지를 보냈습니다. 이것이 위에서 언급한 에코 서버입니다.

다음으로 안내에 따라 "Q"를 입력하여 통화를 종료합니다.

그림

클라이언트 A 종료

이 시점에서 이 통화는 종료됩니다.

6. 마지막으로 2에서 tcpdump 명령 모니터링을 활성화한 인터페이스에서 ctrl+c를 눌러 모니터링을 종료합니다.

그림

패킷 캡처 파일 저장

총 10개의 패킷을 성공적으로 캡처했으며 패킷이 손실되지 않았음을 확인할 수 있습니다. 다음으로 캡처 파일 message.pacp를 Windows로 전송하여 패킷 캡처 분석을 시작합니다.

그림

패킷 캡처 분석

총 10개의 데이터 패킷이 있음을 알 수 있는데, 이는 위의 Linux에서 tcpdump 명령을 통해 캡처한 데이터 패킷 수와도 일치합니다. 그 중 시퀀스 번호 1~3은 3방향 핸드셰이크의 데이터 패킷이고, 시퀀스 번호 4~7은 두 데이터 교환의 데이터 패킷이며, 8~10은 3방향 핸드셰이크의 데이터 패킷입니다.

그림

10개의 패킷이 캡처되었습니다.

질문 1: 4-7 왜 두 개의 데이터 교환이 있습니까?

답변 1: 우리의 에코 서버는 과거에 보낸 데이터와 서버가 다시 보내는 데이터이므로 첫 번째 데이터 교환: 클라이언트 A는 서버 B에 "hello" 데이터를 보내고 B는 수신 확인 응답을 합니다. 이는 또한 데이터 패킷 4와 5에 해당합니다. 두 번째 데이터 교환: 서버 B는 클라이언트 A에게 "hello" 데이터를 보내고 A는 수신 확인 응답을 합니다. 이는 패킷 6과 7에도 해당됩니다.

질문 2: 약속된 네 가지 물결은 어떻습니까? 왜 여기에는 세 번만 있습니까?

답변 2: 서버가 클라이언트의 FIN을 수신한 후 서버도 동시에 연결을 닫을 수 있으므로 ACK와 FIN의 두 패킷을 병합하여 함께 보낼 수 있으므로 네트워크 패킷 하나를 절약하고 "파 4"를 절약할 수 있습니다. 번'은 '세 번 흔들었다'가 됩니다. 이를 통해 네트워크 리소스, 시간 및 노력을 절약할 수 있습니다. 정상적인 상황에서 서버는 클라이언트의 FIN을 수신한 후에도 데이터 전송이 완료되지 않았을 가능성이 높으므로 먼저 클라이언트에 ACK 패킷으로 응답하고, 모든 데이터 패킷 전송을 완료한 후 다음을 보냅니다. FIN 패킷, 즉 "Waved four times"입니다.

그림

3방향 핸드셰이크 프로세스

그림

3파 과정

첫 번째 핸드셰이크, 시퀀스 번호는 1, 클라이언트 A: 192.168.78.128이 SYN 요청 패킷을 서버 B: 192.168.78.130, seq는 1796975076으로 보냅니다.

두 번째 핸드셰이크에서 시퀀스 번호는 2입니다. 서버 B: 192.168.78.130은 클라이언트 A: 192.168.78.128에 SYN 및 ACK 요청 응답 패킷을 보냅니다. seq는 1222412335이고 ack는 1796975077입니다. 이는 첫 번째 핸드셰이크의 seq+입니다. .1.

세 번째 핸드셰이크에서 시퀀스 번호는 3입니다. 클라이언트 A: 192.168.78.128은 서버 B: 192.168.78.130에 ACK 확인 패킷을 보냅니다. seq는 1796975077이고 ack는 1222412336입니다. 이는 두 번째 핸드셰이크에서 seq+1입니다.

두 가지 데이터 상호 작용 프로세스

첫 번째 데이터 상호작용:

그림

첫 번째 데이터 상호작용

시퀀스 번호는 4입니다. 클라이언트 A: 192.168.78.128이 서버 B: 192.168.78.130에 푸시 메시지 패킷을 보냅니다. 아래 데이터는 "hello"로 구문 분석되고 데이터 길이는 len = 6임을 알 수 있습니다.

"hello는 총 5글자 아닌가요? 길이는 5여야 ​​합니다."

시퀀스 번호는 5입니다. 서버 B: 192.168.78.130은 메시지가 수신되었음을 나타내는 ACK 확인 패킷을 클라이언트 A: 192.168.78.128로 보냅니다.

두 번째 데이터 상호작용:

그림

두 번째 데이터 상호작용

시퀀스 번호는 6. 서버 B: 192.168.78.130 클라이언트 A: 192.168.78.128 푸시 메시지 패키지를 보냅니다. 아래 데이터는 "hello"로 구문 분석되고 len = 6인 것을 볼 수 있습니다.

시퀀스 번호는 7입니다. 클라이언트 A: 192.168.78.128은 메시지가 수신되었음을 나타내는 ACK 확인 패킷을 서버 B: 192.168.78.130으로 보냅니다.

3파 과정

공식적인 4파동은 아래와 같습니다.

그림

표준 4파

우리가 포착한 세 가지 파도는 다음과 같습니다.

그림

가방을 잡고 세 번 흔들었어요

첫 번째 웨이브, 시퀀스 번호는 8입니다. 클라이언트 A: 192.168.78.128은 패킷 연결 끊기 FIN 요청을 서버 B: 192.168.78.130으로 보내 연결 끊기 활성 요청을 나타냅니다.

두 번째와 세 번째 웨이브, 시퀀스 번호는 9입니다. 서버 B: 192.168.78.130은 클라이언트 A: 192.168.78.128에 FIN, ACK 확인 및 연결 해제 요청 메시지 패키지를 보냅니다. 이는 마지막 연결 해제 요청을 수신하고 연결 해제를 요청했음을 나타냅니다. 서버에서 클라이언트로의 연결.

우리가 캡처한 패킷에서는 두 번째 웨이브와 세 번째 웨이브가 하나의 데이터 패킷으로 결합된 것을 볼 수 있습니다. 즉, 패킷 192.168.78.130->192.168.78.128에는 FIN과 ACK가 모두 포함되어 있으므로 이 역시 이유입니다. 네 번이 아니라 세 번 흔들었다.

네 번째 웨이브, 시퀀스 번호는 10입니다. 클라이언트 A: 192.168.78.128은 서버 B: 192.168.78.130에 ACK 확인 패킷을 보냅니다. 이는 서버에서 보낸 연결 끊기 메시지를 수신하고 응답을 제공한다는 것을 나타냅니다.

결론

배운 지식을 연결하는 법을 배우는 것이 상사가 될 수 있는 유일한 길 이다

그림

사람에게 낚시하는 법을 가르치는 것보다 낚시하는 법을 가르치는 것이 더 좋습니다. 이 실습에 필요한 모든 파일은 패키지화되어 공유되어 있습니다. 내 QQ 그룹을 추가하고 그룹 파일을 검색하면 얻을 수 있습니다. 연습할 수도 있습니다. 당신 자신. 결국, " 종이에 보이는 것은 결국 얕지만, 자세하게 해봐야 알잖아요 ."
QQ 그룹: 876392689

이런 실용적인 기사가 괜찮다고 생각하시면 메시지 를 남겨 알려주세요. 앞으로 이런 유형의 실용적인 기사를 더 많이 가져오도록 하겠습니다.

그림

거인의 어깨

https://my.oschina.net/u/658658/blog/417739

"TCP/IP 네트워크 프로그래밍"-Yin Shengyu [한국어]

"Wireshark 네트워크 분석은 이렇게 간단합니다" - Lin Peiman

"Wireshark 네트워크 분석의 기술" - Lin Peiman

"컴퓨터 네트워크 - 하향식 접근 방식" - Ames F. Kurose, Keith W. Ross

"TCP/IP 상세 설명 1권: 프로토콜" - kevin R.Fall W.Richard Stevens

                                                                - 끝 -

추천

출처blog.csdn.net/liuxing__jacker/article/details/132975571