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