HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
📖
공부한 책
/
1%의 네트워크 원리
1%의 네트워크 원리
/2장 TCP/IP의 데이터를 전기 신호로 만들어 보낸다/
서버에 접속한다 (TCP 커넥션 확립) - connect()

서버에 접속한다 (TCP 커넥션 확립) - connect()

접속의 의미제어 정보 접속 동작의 실체클라이언트와 TCP와 서버 TCP 사이에 제어 정보 주고 받는 상세 내용 ( TCP 3-way handshake)

접속의 의미

  • 소켓을 만든 직후는 아직 거기에 아무 것도 기록되어 있지 않으므로 통신 상대가 누구인지도 모름
  • 통신 상대와의 사이에 제어 정보를 주고받아 소켓에 필요한 정보를 기록하고 데이터 송.수신이 가능한 상태로 만드는 것임
    • 클라이언트측의 IP주소, 포트 번호를 서버측에 알리는 것
  • 또, 데이터 송.수신 동작을 실행할 때, 송.수신하는 데이터를 일시적으로 저장하는 메모리 영역이 필요한데, 이 메모리 영역을 ‘버퍼 메모리'라고 부르고 버퍼 메모리의 확보도 접속 동작시 실행됨

제어 정보

💡
통신 동작에 이용하는 제어 정보는 다음의 두 종류입니다. - 헤더에 기입되는 정보 - 소켓(프로토콜 스택의 메모리 영역)에 기록되는 정보
필드 명칭
길이(비트)
설명
송신처 포트번호
16
이 패킷을 송신한 측의 프로그램 포트 번호
수신처 포트번호
16
이 패킷을 받는 상대 프로그램의 포트 번호
시퀀스 번호(송신 데이터의 일련 번호)
32
이 패킷의 맨 앞 위치의 데이터가 송신 데이터의 몇 번째 바이트에 해당하는지를 송신측에서 수신측에 전달하기 위한 것임
ACK 번호(수신 데이터의 일련번호)
32
데이터가 몇 바이트까지 수신측에 도착했는지를 수신측에서 송신측에 전달하기 위한 것. ACK는 acknowledge의 약자로, ‘아크’라고 읽음
데이터 오프셋
4
데이터 부분이 어디부터 시작하는지를 나타냄. 헤더의 길이를 나타낸다고 생각하면 됨
컨트롤비트
6
이 필드의 각 비트가 각각 통신 제어상의 의미를 가짐 - URG : 긴급 포인터의 필드가 유효하다는 것을 나타냄 - ACK : 수신 데이터의 일련번호 필드가 유효하다는 것을 나타냄. 보통 데이터가 올바르게 수신측에 도착한 것을 의미 - PSH : flush 동작에 의해 송신된 데이터임을 나타냄 - RST : 접속을 강제로 종료하고 이상 종료시에 사용함 - SYN : 송신측과 수신측에서 일련번호를 서로 확인함. 이것으로 접속 동작을 나타냄 - FIN : 연결 끊기를 나타냄
윈도우
16
수신측에서 송신측에 윈도우 사이즈(수신 확인을 기다리지 않고 묶어서 송신할 수 있는 데이터 양)을 통지하기 위해 사용함
체크섬
16
오류 유무를 검사하기 위한 것
긴급 포인터
16
긴급하게 처리해야 할 데이터의 위치
옵션
가변 길이
위의 헤더 필드 이외의 제어 정보를 기록하기 위해 헤더에 옵션 필드를 추가할 수 있음. 그러나 접속 동작을 제외하면 옵션 필드를 사용하는 예는 적음
  • 위의 규정된 제어정보를 접속, 송.수신, 연결 끊기의 각 단계에서 클라이언트와 서버가 대화할 때마다 부가함 ( 해당 제어 정보를 헤더 라고 부름)
  • 클라이언트와 서버는 이 헤더에 필요한 정보를 기록하여 연락을 취하면서 통신동작을 진행함.
    • 송신측 : 데이터 송신 동작을 개시합니다. 수신측 : 예, 잘 알겠습니다. 송신측 : 00 번째 데이터를 보냅니다. 수신측 : 00 번째 데이터를 받았습니다.
  • 위의 대화가 헤더에 기록된 제어 정보에 의해 이루어짐
클라이언트와 서버 사이에 주고받는 제어 정보
클라이언트와 서버 사이에 주고받는 제어 정보

접속 동작의 실체

  • Socket 라이브러리의 connect를 호출
    • connect(< 디스크립터>, <서버측의 IP 주소와 포트 번호>, …)
    • 명령이 프로토콜 스택의 TCP 담당 부분에 전달
    • TCP 담당 부분은 IP 주소로 표시된 상대, 즉 서버의 TCP 담당 부분과의 사이에 제어 정보를 주고 받음

클라이언트와 TCP와 서버 TCP 사이에 제어 정보 주고 받는 상세 내용 ( TCP 3-way handshake)

  1. 데이터 송.수신 동작의 개시를 나타내는 제어 정보를 기록한 TCP 헤더를 만듦
      • 송신처와 수신처의 포트 번호가 중요함 ( 클라이언트측의 소켓과 서버측의 소켓을 지정 )
      • 컨트롤 비트인 SYN 이라는 비트를 1로 만듦
  1. IP 담당 부분에 건네주어 송신하도록 의뢰함
      • IP 담당 부분이 패킷 송신 동작 실행
      • 서버에 도착하면 서버측의 IP 담당 부분이 이것을 받아 TCP 담당 부분에 건네줌
      • 서버 측의 TCP 담당이 TCP 헤더를 조사하여 기록되어 있는 수신처 포트 번호에 해당하는 소켓 찾아냄
      • 접속을 기다리는 상태에 있는 소켓 중 수신처 포트번호와 같은 번호가 기록된 소켓
  1. 서버측에서 클라이언트와 마찬가지로 송신처 수신처 포트 번호 SYN 비트 등을 설정한 TCP 헤더 만들고 IP 담당 부분에 건네주어 클라이언트로 송신
      • ACK 라는 컨트롤 비트도 1로 만듦 ( 패킷 받은 것을 알리기 위해)
  1. 패킷이 클라이언트에 돌아오고 IP 담당 부분 경유하여 TCP 담당 부분에 도착. TCP 헤더 조사하여 서버측의 접속 동작이 성공했는지를 확인
      • SYN이 1이면 접속 성공
  1. 클라이언트가 ACK 비트 1로 만든 TCP 헤더 반송 (잘 받았다는 확인 응답)
💡
이로써 소켓은 데이터를 송.수신 할 수 있는 상태가 됨. 이때 파이프와 같은 것으로 소켓이 연결되었다고 생각할 수 있음 이 파이프와 같은 것을 커넥션(혹은 세션) 이라고 함. 커넥션은 데이터 송.수신 동작을 계속하고 있는 동안, 즉 close를 호출하여 연결을 끊을 때까지 계속 존재함