TCP Connection
Set up 과정의 3-way hand shaking

1. SYN segment
seq: 8000 | Server에 연결 요청
2. SYN + ACK segment
seq: 15000 | Client에 연결 요청
ack: 8001 | Client의 연결 승인
- 15000은 랜덤값임.
- 8001은 Server가 다음에 받아야하는 seq num임.
- header만 전달됨.
3. ACK segment
seq: 8000 | garbage 값임
ack: 15001 | Server의 연결 승인.
- 15001은 Client가 다음에 받아야하는 seq num임.
- 이 그림에서는 ACK segment의 data가 없으므로 seq가 garbage 값
Q. ACK segment의 seq가 garbage 값인지 알수 있을까?
A. data의 값이 없기 떄문에 seq가 garbage임. 반대로 data가 있으면 garbage가 아님.
- SYN + ACK segment 과정은 2개(ACK 전달 후, SYN 전달)로 분리해도 괜찮음.
- 이 세 과정이 끝나면 Client와 Server에 buffer가 만들어진다.
- Server, Client 별로 buffer가 상이함.
Data Transfer (양방향)

Connection Termination
Terminate 과정의 3-way hand shaking

FIN segment
seq: x | Server에 연결 종료 요청
FIN + ACK segment
seq: y | Client에 연결 종료 요청
ack: x + 1 | 종료 요청 승인
- ack를 통해 Client에 종료 되었다는 사실을 알려줌.
ACK segment
ack: y + 1 | 종료 요청 승인
- ack를 통해 Server에 종료 되었다는 사실을 알려줌.
Terminate 과정의 4-way hand shaking

- Terminate 과정의 3-way hand shaking과 나머지는 동일하지만 FIN + ACK segment가 다름.
- FIN은 사람이 보내고, ACK는 시스템이 보냄.
- FIN을 하면 read는 0을 반환함.
ACK segment, FIN segment
- FIN + ACK segment가 4hand에서는 FIN segment, ACK segment로 분리됨.
Q. ACK segment, FIN segment이다.와 FIN + ACK segment의 차이점?
A. ACK segment, FIN segment 사이에 무슨 일을 하냐에 따라 동시에 나갈수도, 따로 나갈 수도 있음. 여기서 동시에 나가는 경우는 FIN + ACK segment이고, 따로 나가는 경우는 ACK segment, FIN segment이다.
Packet exchange for TCP connection

Half-Close

- Client는 close하고, Server는 닫지 않고 계속해서 data를 전달하는 그림이다.
- Server에서 Client의 연결을 끊는 것을 승인한 후에 Client의 Sending buffer를 삭제한다. 하지만 receiving buffer는 아직 살아있다.
- 맨 마지막 packet에서 처럼, sending buffer가 닫혀도(half-close) 응답(ack)은 해줘야함