SOCKET FUNCTIONS
Socket Operation
Basic Operations Using Sockets

- socket() 실행 시 , 파일 디스크립터 처럼 디스크립터 id를 반환해줌. 이를 사용해서 접근하는 방식.
- TCP
1.socket() 생성
2.Bind(): 대부분 서버쪽에서 지정을 하게된다. 소켓을 특정 IP주소와 포트번호에 지정하는 부분.
- listen(): 서버쪽에서 요청을 받기위한 준비
- connect(): Client에서 3-handshake 시작
- accept(): 연결완료
- recv(), send()로 주고 받음
- close(): 종료
- UDP
- socket() 생성
- bind(): 위와 같음
3-1 클라이언트: sendto() 함수를 사용하여 데이터를 서버로 전송
3-2 서버: recvfrom() 함수로 클라이언트로부터 데이터를 수신
- 데이터 수신 및 응답
- 서버: 데이터를 처리한 후, sendto() 함수를 사용하여 응답을 클라이언트에게 본낸다.
- 클라이언트 : recvfrom() 함수로 서버의 응답을 수신
- 소켓 닫기:
- 통신이 완료되면 양쪽 모두 close() 함수를 호출하여 소켓을 닫는다.
Five elements for creating a socket

- socket은 transprot Layer과, network Layer, kernel(OS) 모두와 연관되어 있음.
- 생성할때, 현재 ip, port와 원격 ip, port가 존재해야한다.
socket() function

- 소켓을 통해서 내부에서도 사용하여 다른 프로세스간 통신이 가능하다.
- 도메인
- 타입
- TCP, UDP 선택
- SOCK_RAW는 바이패스시 사용할 수 있는 것들 -> 나중에 배울 것이다.
- protocol:
socket types and protocol

- 여러개가 있지만, 안쓰는 것들이 많다 참고만 해라
- socket 1,2,3만 사용해라
Type
타입 같은 경우는 그냥 0으로 쓰게 되면 자동으로 맞는 프로토콜로 사용된다.
TCP Connection Setup
3-way handshake

Socket programming viewpoint
- 이런 것들은 이해만 해라.
- 나중에 프로그래밍할때 디테일하게 진행될 것.
Closing Socket
close() function

- 다 끝난다음 실행하는 close() 함수
- close 함수에 들어가는 int 값은 소켓 discriptor number이다.
TCP Connection Termination

- 초기 상태:
- 클라이언트와 서버 모두 ESTABLISHED 상태이다.
-> ESTABLISHED 상태: TCP연결이 완전히 설정되어 데이터 전송이 가능한 상태.
- 클라이언트 연결 종료 시작:
- 클라이언트가 socket.close()를 호출한다.
- FIN_WAIT_1 상태로 진입하며, FIN 패킷을 서버로 보낸다.
- 이 시점부터 클라이언트는 데이터를 보낼 수 없지만 받을 수는 있다.
- 서버 응답:
- 서버는 CLOSE_WAIT 상태로 전환된다.
- 클라이언트의 FIN에 대한 ACK를 보낸다.
- 서버는 여전히 데이터를 보낼 수 있다.
- 클라이언트 대기:
- 클라이언트는 FIN_WAIT_2 상태로 진입한다.
- 서버의 FIN을 기다린다.
- 서버연결 종료:
- 서버가 종료 준비를 마치면 LAST_ACK 상태로 전환된다.
- 서버도 FIN 패킷을 클라이언트에게 보낸다.
- 클라이언트 최종응답:
- 클라이언트는 서버에 FIN에 대한 ACK를 보낸다.
- TIME_WAIT 상태로 전환되며, 2 * MSL(Maximum Segment Lifetime) 동안 대기한다.
- 연결 완전 종료:
- 대기 시간 후 클라이언트는 CLOSED 상태가 된다.
- 서버는 마지막 ACK를 받은 후 CLOSED 상태가 된다.
위 과정을 4-WAY HANDSHAKE 라고 한다.
MSL(Maximum Segment liftime)

shutdown() function
- 위 문제를 해결하기 위한 함수

드는 생각 및 기록
- 교수님께서 이부분은 당연히 알아야하는 곳이라고 하심
- 코드 및 함수 관련 부분들은 외우는 것이 아닌 나중 네트워크 프로그래밍을 진행할때 이해가 안되는 부분은 여기서 보라고 하심.
-> 내용을 이해하고, 필요상황에 사용할 수 있도록 숙련시켜라