개발 서적 완독하기/성공과실패를결정하는1%네트워크

성공과 실패를 결정하는 1% 네트워크 - 서버의 수신 동작

코드 살인마 2023. 2. 19. 12:44
728x90

1. LAN 어댑터에서 수신 신호를 디지털 데이터로 변환한다.

수신 동작은 패킷의 신호를 LAN 어댑터에서 수신하고 디지털 데이터로 바꾸는 부분에서 시작된다. LAN을 흐르는 패킷의 신호는 1과 0으로 이루어진 디지털 데이터의 신호와 타이밍을 나타내는 클록 신호를 합성한 것이다.

 

여기에서 클록 신호를 추출하고 클록 신호에서 타이밍을 계산하면서 신호를 읽어오면, 1과 0의 디지털 데이터로 바꿀 수 있다.

신호에서 디지털 데이터로 되돌린 패킷은 아래와 같다.

  • LAN 어댑터 담당
    • 프리앰블/스타트 프레임 딜리미터
    • FCS
  • IP가 담당
    • MAC 헤더
    • IP 헤더
  • TCP가 담당
    • TCP 헤더
  • 데이터
    • 이부분을 만드는 것이 애플리케이션의 담당

LAN 어댑터의 MAC 부분이 패킷을 신호로부터 디지털 데이터로 되돌리고 FCS을 점검한 후 버퍼 메모리에 저장한다.

LAN 드라이버가 MAC 헤더로부터 프로토콜을 판단하여 프로토콜 스택에 패킷을 건네준다.

2. IP 담당 부분의 수신 동작

프로토콜 스택에 패킷이 전달되면 우선 IP 담당 부분이 동작하여 IP 헤더를 점검한다.

이후, 나한테 온게 맞는지 수신처 IP 주소로 확인한다.

 

그다음은 조각 나누기에 의해 패킷이 분할 되어 있는지 확인하고(IP 헤더에서 확인 가능) 분할 되어 있는 경우에는 패킷을 일시적으로 메모리에 저장한다. 이후 분할된 패킷이 전부 도착하면 원래 패킷으로 복원한다.

 

그러면 IP 헤더의 프로토콜 번호 항목을 조사하여 해당하는 담당 부분에 패킷을 건네준다.

 

프로토콜 스택의 IP 담당 부분은 IP 헤더를 점검하고 1) 자신을 대상으로 한건지 판단 2) 조각 나누기에 의해 패킷 분할 있는지 조사 3) TCP 담당 부분 또는 UDP 담당 부분에 패킷을 건네준다.

3. TCP 담당 부분이 접속 패킷을 수신했을 때의 동작

패킷의 TCP 헤더에 있는 SYN이라는 컨트롤 비트가 1로 되어 있으면 접속 동작의 패킷입니다. 그전에 도착한 패킷의 수신처 포트 번호와 같은 번호가 할당한 접속 대기 상태의 소켓이 있는지 확인하고 없으면 오류 통지 패킷을 클라에 반송한다.

 

여기에 송신처의 IP 주소나 포트 번호, 시퀀스 번호의 초기값, 윈도우의 값 등 필요한 정보를 기록한다. 동시에 송신 버퍼나 수신 버퍼로 사용하는 메모리 영역을 확보한다. 패킷을 받았음을 나타내는 ACK 번호, 서버 → 클라에 보내는 시퀀스 번호 초기값, 클라→ 서버로 보내온 데이터를 받기위한 수신 버퍼의 빈 용량을 나타내는 윈도우 값 등의 항목을 기록한 TCP 헤더를 만들고 이것을 IP 담당 부분에 의뢰한여 클라에 반송한다.

 

이때 서버측의 애플리 케이션은 accept을 호출하여 실행을 쉬고 있는데 여기에 새로 만든 소켓의 디스크립터를 전달하여 서버 애플리케이션의 동작을 재개한다.

 

패킷이 접속 동작 패킷인 경우 TCP 담당 부분은 1) TCP 헤더의 SYN 컨트롤 비트를 확인 2) 수신처 포트 번호 조사 3) 해당하는 접속 대기 소켓을 복사하여 새 소켓 작성 4) 송신처의 IP주소나 포트 번호 등을 기록

4. TCP 담당 부분이 데이터 패킷을 수신했을 때의 동작

이제 데이터 송 수신 단계에 들어가서 데이터 패킷이 도착한 경우이다.

 

IP 헤더의 송신처 IP 주소, 수신처 IP 주소, TCP 헤더의 수신처 포트 번호와 송신처 포트 번호 4개의 정보에 매칭되는 소켓을 찾는다. 데이터 조각을 연결하여 수신 버퍼에 보관한 후 클라이언트에게 ACK을 돌려준다.

 

(이후 수신한 데이터를 수신 버퍼에 저장하면 수신 확인 응답용 TCP 헤더를 만든다. 여기에 수신 패킷의 시퀀스 번호, 데이터 조각의 길이로부터 계산한 ACK 번호를 기록하고, IP 담당 부분에 의뢰하여 클라이언트를 반송한다.)

 

제어가 서버 애플리케이션으로 넘어가 받은 데이터를 처리하면 즉 HTTP의 리퀘스트 메시지의 내용을 조사하고, 내용에 따라 브라우저에 데이터를 반송하는 동작으로 넘어간다.

5. TCP 담당 부분의 연결 끊기 동작

데이터 송 수신이 끝나면 연결 끊기 동작에 들어간다. 이때의 동작은 클라이언트 측과 같다.

 

TCP 프로토콜 규칙에 따르면 연결 끊기 동작은 클라이언트와 서버 중 어느 쪽이 먼저 실행해도 상관 없다. 애플리케이션이 어디에서부터 연결 끈힉 동작을 실행하는지 결정해야한다. 웹의 경우 버전에 따라 다르다.(http)

 

서버에서 먼저 끊는다면 Socket 라이브러리의 close 호출, 이후 TCP 담당 부분이 FIN 컨트롤 비트에 1 설정하여 헤더 만들고, IP 담당 부분에 의뢰하여 클라로 보낸다.

 

이것을 받은 클라는 ACK 번호를 반송하고 클라이언트가 close를 계속 호출하고, FIN을 1로 한 TCP 헤더를 서버에 보낸 후 서버가 ACK 번호를 반송하면 연결 끊기 동작은 끝난다.

 

이후 소켓을 말소한다.